DEV Community

Anh Trần Tuấn
Anh Trần Tuấn

Posted on • Originally published at tuanh.net on

What is the Difference Between @Controller and @RestController in Spring MVC?

1. Understanding the Basics

Before diving into the differences, it’s essential to comprehend what @Controller and @RestController represent.

1.1 What is @Controller?

@Controller is an annotation used in Spring MVC to indicate that a particular class serves the role of a controller in the Model-View-Controller (MVC) design pattern. It is responsible for handling HTTP requests and returning a view, typically an HTML page, to the client.

@Controller
public class MyController {
    @GetMapping("/greet")
    public String greet(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "greeting";
    }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the greet method returns the name of a view (greeting), which will be resolved to an HTML page by a view resolver.

1.2 What is @RestController?

@RestController is a specialized version of @Controller. It is a convenience annotation that combines @Controller and @ResponseBody. This means that instead of returning a view, it directly returns the data as a JSON or XML response.

@RestController
public class MyRestController {
    @GetMapping("/greet")
    public String greet() {
        return "Hello, World!";
    }
}
Enter fullscreen mode Exit fullscreen mode

In this case, the greet method returns a simple string, which will be serialized to JSON and sent back to the client.

2. Key Differences Between @Controller and @RestController

2.1 View Rendering vs. Data Serialization

The most significant difference between @Controller and @RestController lies in how they handle the return values of methods.

  • @Controller : The method’s return value is typically the name of a view, and Spring MVC resolves this view to render an HTML page. It’s designed for creating web pages and handling web form submissions.
  • @RestController : The method’s return value is automatically serialized into the desired format (e.g., JSON or XML) and returned directly to the client. It’s primarily used in RESTful web services to send data to the client rather than HTML views.

2.2 Combining with @ResponseBody

@RestController is essentially a combination of @Controller and @ResponseBody. This means that every method in a class annotated with @RestController will have its return value serialized into the response body, eliminating the need to annotate each method with @ResponseBody.

In contrast, with @Controller , you need to explicitly annotate each method with @ResponseBody if you want to return JSON or XML data.

@Controller
public class MyController {
    @GetMapping("/data")
    @ResponseBody
    public String getData() {
        return "Some data";
    }
}
Enter fullscreen mode Exit fullscreen mode

This code does the same as @RestController , but you need to include @ResponseBody for every method.

2.3 Use Cases

  • @Controller : Use this when building a traditional web application where you need to return views (HTML pages). It’s best suited for MVC applications.
  • @RestController : Use this when building RESTful web services or APIs. It’s designed to return data in formats like JSON, XML, etc., directly to the client.

3. Conclusion

Understanding the difference between @Controller and @RestController is fundamental when developing web applications with Spring MVC. @Controller is ideal for returning views in traditional web applications, while @RestController simplifies the creation of RESTful services by returning data directly in formats like JSON or XML.

If you have any questions or need further clarification, feel free to leave a comment below!

Read posts more at : What is the Difference Between @Controller and @RestController in Spring MVC?

Top comments (0)