1. Introduction
In this tutorial, we’ll discuss the difference between @Controller and @RestController annotations in Spring MVC.
The @Controller annotation is available since Spring 2.5 whereas @RestController was introduced in Spring 4.0 to simplify creation of RESTful web services.
2. @Controller annotation
This annotation is a specialization of @Component and indicates that the annotated class is a controller, for example a web controller.
The classes annotated with @Controller can be autodetected through classpath scanning. We typically use @Controller in combination with a @RequestMapping annotation for request handling methods.
This annotation is in org.springframework.stereotype package.
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Controller
Following is a typical example of using @Controller annotation.
@Controller
@RequestMapping("firstController")
public class HelloController {
@GetMapping(value = "/hello", produces = "application/json")
public @ResponseBody String print() {
return "hello";
}
}
We have annotated the request handling method with @ResponseBody, which indicates a method return value should be bound to the web response body.
3. @RestController annotation
This annotation is available since Spring 4.0. The @RestController annotation is itself annotated with @Controller and @ResponseBody, so if you are using @RestController then you don’t need to use @Controller and @ResponseBody.
This controller is in org.springframework.web.bind.annotation package.
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Controller @ResponseBody public @interface RestController
When you annotate a class with @RestController then it is treated as Controller and @RequestMapping methods assume @ResponseBody semantics by default.
If a class is annotated with @RestController then @RequestMapping methods need not to be annotated with @RequestBody.
The controller which we wrote earlier can be rewritten using @RestController as:
@RestController
@RequestMapping("firstController")
public class HelloController {
@GetMapping(value = "/hello", produces = "application/json")
public String print() {
return "hello";
}
}
4. Conclusion
In this article, we discussed the @Controller and @RestController annotation and their difference.
