Sự khác biệt giữa chú thích mùa xuân @Contoder và @RestControll


357

Sự khác biệt giữa mùa xuân @Controller@RestControllerchú thích.

Có thể @Controllerchú thích được sử dụng cho cả các ứng dụng Web MVC và REST?
Nếu có, làm thế nào chúng ta có thể phân biệt nếu đó là ứng dụng Web MVC hoặc REST.

Câu trả lời:


471
  • @Controller được sử dụng để đánh dấu các lớp là Spring MVC Controller.
  • @RestControllerlà một chú thích tiện lợi không gì khác hơn là thêm các chú thích @Controller@ResponseBodychú thích (xem: Javadoc )

Vì vậy, hai định nghĩa bộ điều khiển sau đây nên làm như vậy

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
Tôi nghĩ rằng @RestControll cũng tự động chuyển đổi phản hồi thành JSON / XML.
arnabkaycee

1
Chỉ cần chia sẻ một liên kết đến một hướng dẫn về mùa xuân giải thích sự khác biệt của spring.io/guides/gs/rest-service
Mina Samy

9
Ngoài ra nếu bạn sử dụng công cụ mẫu như Thymeleafnó sẽ không hoạt động @RestController@ResponseBodyđược bao gồm trong chú thích này.
Sonique

3
@ResponseBodylàm cho các đối tượng được trả về thành một thứ có thể có trong cơ thể, ví dụ JSON hoặc XML ( nguồn )
Martin Thoma

59

Trong đoạn mã dưới đây tôi sẽ cho bạn thấy sự khác biệt giữa @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

những @ResponseBodyđược kích hoạt theo mặc định. Bạn không cần thêm nó phía trên chữ ký hàm.


1
Tên lớp trong Java sẽ bắt đầu viết hoa, tức là RestClassName (không phải restClassName).
Razzle

24

Nếu bạn sử dụng, @RestControllerbạn không thể trả về chế độ xem (Bằng cách sử dụng Viewresolvertrong Spring / springboot) và @ResponseBodykhông cần thiết trong trường hợp này.

Nếu bạn sử dụng, @Controllerbạn có thể trả về một khung nhìn trong Spring web MVC.


Có, @ResponseBody có thể được đặt trên một phương thức và chỉ ra rằng kiểu trả về phải được ghi thẳng vào phần phản hồi HTTP (và không được đặt trong Mô hình hoặc được hiểu là tên xem)
PraveenKumar Lalasangi


14

Trên thực tế, hãy cẩn thận - chúng không hoàn toàn giống nhau.

Nếu bạn xác định bất kỳ thiết bị chặn nào trong ứng dụng của mình, chúng sẽ không áp dụng cho Bộ điều khiển được chú thích như @RestController, tuy nhiên chúng hoạt động với @Controllerbộ điều khiển có chú thích.

I E. cấu hình cho thiết bị chặn:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

và trong phần khai báo của bộ điều khiển Spring:

@Controller
public class AdminServiceController {...

Sẽ làm việc, tuy nhiên

@RestController
public class AdminServiceController {...

cuối cùng không có thiết bị chặn được liên kết với nó.


2
@RestControllerđược giới thiệu vào mùa xuân 4x. Chú thích này cũng được chú thích bởi @Controllervì vậy nếu nó không hoạt động như một @Controllerthì báo cáo đây là một lỗi.
gaoagong

@bertybro, điều đó không hoàn toàn đúng. Bạn có thể liên kết một Interceptorđến a @RestController.
Ravi-A-Doer

Tôi chắc chắn đã gắn kết thành công Interceptorvới a @RestController.
Ben Barden

11

Như bạn có thể thấy trong tài liệu Spring ( Tài liệu Spring RestContoder ) Chú thích bộ điều khiển nghỉ giống như chú thích của bộ điều khiển, nhưng giả sử rằng @ResponseBody được kích hoạt theo mặc định, vì vậy tất cả các json đều được phân tích cú pháp cho các đối tượng java.


4

Chú thích @RestContoder mới trong Spring4 +, đánh dấu lớp là một bộ điều khiển trong đó mọi phương thức trả về một đối tượng miền thay vì dạng xem. Đó là cách viết tắt của @Contoder và @ResponseBody cuộn lại với nhau.


3

@RestControllerđược cung cấp từ mùa xuân 4.0.1. Các bộ điều khiển này chỉ ra rằng ở đây các phương thức @RequestMapping giả định ngữ nghĩa @ResponseBody theo mặc định.

Trong các phiên bản trước, chức năng tương tự có thể đạt được bằng cách sử dụng bên dưới:

  1. @RequestMappingkết hợp với @ResponseBodynhư@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> có thể được sử dụng như một trong những cách sử dụng JSON với Jackson hoặc xml.

  3. MyBean có thể được định nghĩa như

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody được coi là khung nhìn ở đây giữa MVC và nó được gửi trực tiếp thay vì được gửi từ Dispatcher Servlet và các trình chuyển đổi tương ứng chuyển đổi phản hồi theo định dạng liên quan như text / html, application / xml, application / json.

Tuy nhiên, Bộ điều khiển đã được kết hợp với FeedbackBody và các bộ chuyển đổi tương ứng. Thứ hai, ở đây, vì thay vì chuyển đổi phản hồi, nó sẽ tự động được chuyển đổi thành phản hồi http.


2

@Controllertrả lại View. @RestControllertrả lại ResponseBody.


2
Bạn nên giải thích thêm. Làm thế nào là điều này trả lời câu hỏi?
Yunnosch

@Yunnosch 'view' là giao diện người dùng của bạn như jsp hoặc html. Phản hồi có thể là xml, json, yaml
G.Brown 16/07/19

Vui lòng chỉnh sửa câu trả lời của bạn để thêm thông tin hữu ích. Tuy nhiên tôi vẫn không hiểu làm thế nào nó nên trả lời câu hỏi. Bạn có thể diễn đạt một lời giải thích như "Có bạn có thể / Không bạn không thể, bởi vì ...."?
Yunnosch

1

Chú thích @RestControll được giới thiệu vào Mùa xuân 4.0 để đơn giản hóa việc tạo các dịch vụ web RESTful. Đó là một chú thích tiện lợi kết hợp @Controll và @ResponseBody - loại bỏ yêu cầu chú thích mọi phương thức xử lý yêu cầu của lớp trình điều khiển với chú thích @ResponseBody.


0
  • @Controller: Chú thích này chỉ là một phiên bản chuyên biệt @Componentvà nó cho phép các lớp điều khiển được tự động phát hiện dựa trên quét đường dẫn lớp.
  • @RestController: Chú thích này là phiên bản chuyên biệt trong @Controllerđó tự động thêm @Controller@ResponseBodychú thích để chúng tôi không phải thêm @ResponseBodyvào các phương pháp ánh xạ của mình.

0

@Controll được sử dụng trong các hệ thống cũ sử dụng các tệp JSP. nó có thể trả về lượt xem @RestControll là để đánh dấu bộ điều khiển đang cung cấp dịch vụ REST với loại phản hồi JSON. do đó, nó kết hợp các chú thích @Contoder và @ResponseBody lại với nhau.


-3

@RestControllerlà thành phần của @Controller@ResponseBody, nếu chúng ta không sử dụng @ResponseBodychữ ký trong Phương thức thì chúng ta cần sử dụng @Restcontroller.


-3

Thay vì sử dụng @Controll và @ResponseBody, @RestControll hãy để bạn trưng bày các API còn lại trong Spring 4.0 trở lên.


Bạn muốn nói rằng tôi nghĩ @RestControll cũng tự động chuyển đổi phản hồi thành JSON / XML. ? bạn đã sử dụng một câu trừu tượng thay vì giải thích rõ ràng, tôi sẽ không đề xuất điều đó.
cinqS

Nghĩ về nó, @Contoder thực hiện tương tự như việc hte tạo ra và tiêu thụ các loại mime JSON / XML hoặc nói cách khác ... @ FeedbackBody nói với Trình điều khiển hoạt động như điểm cuối REST mà không tạo Chế độ xem. RestControll hoàn toàn làm điều đó.
CoffeeBeanie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.