Tags:

Phân biệt @RestController với @Controller trong Spring

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@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@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@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@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

4.5 4 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x