Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu những điểm khác như giữa @Controller và @RestController annotation trong Spring.
Chắc nhiều bạn nếu ban đầu đã làm việc với Spring Boot luôn thì có lẽ chỉ toàn sử dụng @RestController để tạo Rest API thôi chứ quan tâm gì đến @Controller làm gì nhỉ.
Thế nhưng các bạn nào có ngờ rằng, @RestController chỉ đơn giản là kết hợp @Controller và @ResonseBody annotation lại với nhau nhầm loại bỏ việc chúng ta phải chú thích tất cả các hàm bên trong với @ResponseBody annotation.
@Controller
Trong mô hình MVC với các class ở tầng controller sẽ được chú thích với @Controller annotation. Nó là một trong trường hợp đặc biệt của @Component annotation, bản thân @Controller annotation cũng đã được chú thích với @Component, cho phép Spring tự động quét và đăng ký với Spring IoC.
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { @AliasFor( annotation = Component.class ) String value() default ""; }
@Controller thường được sử dụng chúng với @RequestMapping annotation để xử lý các request đến server.
@Controller @RequestMapping("books") public class SimpleBookController { @Autowired private BookService bookService; @GetMapping("/{id}", produces = "application/json") public @ResponseBody Book getBook(@PathVariable int id) { return bookService.findBookById(id); } }
Hàm getBook() được chú thích với @ResponseBody cho phép Spring tự động serialization object trả về của nó vào HttpResponse.
@RestController
Như đã thảo luận ở trên, chúng ta có thể thấy một điểm bất cập khi sử dụng @Controller là tất cả các hàm xử lý request bên trong phải được chú thích với @ReponseBody để Spring tự động serialization object trả về của nó vào HttpResponse.
Do vậy, trong Spring 4.0 đã giới thiệu @RestController annotation kết hợp cả @Controller và @ResponseBody bên trong, do vậy chúng ta không cần phải sử dụng @ResponseBody cho các hàm bên trong.
Chúng ta có thể triển khai lại ví dụ trên với @RestController mà không cần chú thích @ResponseBody cho hàm getBook().
@RestController @RequestMapping("books") public class SimpleBookController { @Autowired private BookService bookService; @GetMapping("/{id}", produces = "application/json") public Book getBook(@PathVariable int id) { return bookService.findBookById(id); } }
Kết bài
Như vậy qua bài viết này chúng ta đã biết cách phân biệt 2 annotation @Controller và @RestController trong Spring. Trong đó @RestController có vẽ chiếm ưu thế hơn nhờ vào việc chúng ta không cần phải lặp đi lặp lại công việc chú thích @ResponseBody annotation cho tất cả các hàm bên trong controller class.
Nguồn tham khảo
https://www.baeldung.com/spring-controller-vs-restcontroller