Câu trả lời:
@Controller
được sử dụng để đánh dấu các lớp là Spring MVC Controller.@RestController
là 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
và @ResponseBody
chú 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 { }
Thymeleaf
nó sẽ không hoạt động @RestController
vì @ResponseBody
được bao gồm trong chú thích này.
@ResponseBody
là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, @RestController
bạn không thể trả về chế độ xem (Bằng cách sử dụng Viewresolver
trong Spring / springboot) và @ResponseBody
không cần thiết trong trường hợp này.
Nếu bạn sử dụng, @Controller
bạn có thể trả về một khung nhìn trong Spring web MVC.
@RestController
các lớp chú thích giống như @Controller
nhưng các @ResponseBody
phươ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 @Controller
bộ đ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 @Controller
vì vậy nếu nó không hoạt động như một @Controller
thì báo cáo đây là một lỗi.
Interceptor
đến a @RestController
.
Interceptor
vớ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:
@RequestMapping
kết hợp với @ResponseBody
như@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.
@Controller
trả lại View
. @RestController
trả 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 @Component
và 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
và @ResponseBody
chú thích để chúng tôi không phải thêm @ResponseBody
và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.