Câu trả lời:
@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 @Controllervà @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 { }
Thymeleafnó sẽ không hoạt động @RestControllervì @ResponseBodyđược bao gồm trong chú thích này.
@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 )
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
}
}
và @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.
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.
@RestControllercác lớp chú thích giống như @Controllernhưng các @ResponseBodyphương thức xử lý được ngụ ý.
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ó.
@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.
Interceptorđến a @RestController.
Interceptorvới a @RestController.
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.
@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:
@RequestMappingkết hợp với @ResponseBodynhư@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<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.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@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.
@Controllertrả lại View. @RestControllertrả lại ResponseBody.
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.
@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 @Controllervà @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.@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.
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.