In Spring Framework, both @RestController
and @Controller
are used to define controllers that handle HTTP requests, but they serve different purposes and are used in different contexts. Here’s a comparison of @RestController
and @Controller
:
1. @RestController
-
Purpose:
@RestController
is a specialized version of@Controller
in Spring Boot that is used for creating RESTful web services. It combines the behavior of@Controller
and@ResponseBody
. -
Automatically Adds
@ResponseBody
: When you use@RestController
, the response from the methods is automatically serialized into JSON or XML and returned in the HTTP response body. There is no need to annotate each method with@ResponseBody
.
Example:
1 2 3 4 5 6 7 8 |
@RestController public class MyRestController { @GetMapping("/api/hello") public String sayHello() { return "Hello, World!"; } } |
In this example, the response "Hello, World!"
is automatically serialized as JSON (or another configured format) and returned to the client without needing @ResponseBody
.
- Main Use Case:
@RestController
is primarily used for REST APIs where the server responds with data (typically JSON or XML) rather than rendering views.
Advantages:
- Simplifies the creation of RESTful APIs by avoiding the need for
@ResponseBody
in each method. - Returns JSON, XML, or other data formats by default, rather than rendering a web page (view).
2. @Controller
-
Purpose:
@Controller
is a more general-purpose annotation used for MVC (Model-View-Controller) controllers in Spring. It is typically used when you want to return views (e.g., HTML) rather than JSON or XML data. -
View Rendering: Unlike
@RestController
, methods in a@Controller
return view names (e.g., JSP, Thymeleaf templates). The returned view name is resolved by a ViewResolver to render the web page. -
Requires
@ResponseBody
for Data: If you want to return data (like JSON) from a@Controller
, you need to explicitly add the@ResponseBody
annotation to the method. Without@ResponseBody
, the method would return a view name by default.
Example (without @ResponseBody
):
1 2 3 4 5 6 7 8 9 |
@Controller public class MyController { @GetMapping("/hello") public String sayHello(Model model) { model.addAttribute("message", "Hello, World!"); return "hello"; // returns the view name "hello" } } |
In this example:
- The method returns the view name
hello
, and the message "Hello, World!" is added to the model. - The ViewResolver will look for a view (e.g., a Thymeleaf or JSP page) called
hello.html
orhello.jsp
to render the response.
Example (with @ResponseBody
):
1 2 3 4 5 6 7 8 9 |
@Controller public class MyController { @GetMapping("/api/hello") @ResponseBody public String sayHello() { return "Hello, World!"; } } |
In this case, adding @ResponseBody
tells Spring to return "Hello, World!"
as the response body, serialized as JSON or XML, instead of rendering a view.
Advantages:
- Used when you want to render web pages as responses, typically in MVC-based web applications.
- Provides more flexibility for web applications where views and UI are involved.
Key Differences
Aspect | @RestController |
@Controller |
---|---|---|
Purpose | Used for building RESTful APIs. | Used for handling web pages (MVC). |
Automatic Serialization | Automatically serializes response data to JSON/XML (or other formats). | No automatic serialization. Typically used to return views (e.g., HTML pages). |
Response Type | Returns data directly in the HTTP response body (e.g., JSON). | Returns view names to be resolved by a ViewResolver (e.g., Thymeleaf, JSP). |
@ResponseBody Requirement |
Not required (applied implicitly). | Required if you want to return data instead of views. |
Use Case | REST APIs where the client expects JSON/XML. | MVC-based web applications where views need to be rendered (e.g., HTML pages). |
View Rendering | Doesn’t render views. Directly returns data. | Renders views like HTML, JSP, or Thymeleaf templates. |
When to Use @RestController
vs @Controller
-
Use
@RestController
:- When building RESTful services.
- When you need to return JSON, XML, or other structured data formats directly to the client.
- When you’re building a microservice or an API that doesn’t serve HTML pages but instead handles data responses.
-
Use
@Controller
:- When building a web application where you need to return views (e.g., JSP, Thymeleaf).
- When you need to follow the Model-View-Controller (MVC) design pattern to build web pages.
- When your primary goal is rendering UI and web pages for users to interact with.
Conclusion
@RestController
simplifies the development of RESTful APIs by automatically serializing responses as JSON or XML. It is best suited for cases where you’re delivering data rather than web pages.@Controller
is used when you need to return views (web pages) and follow the MVC pattern, making it more suitable for traditional web applications where rendering UI is required.