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