In this quick article, we will discuss one important interview question that is what is the difference between @Controller vs @RestController in Spring.
@Controller vs @RestController in Spring
The main difference between the @Controller and @RestController annotations is that the @ResponseBody annotation is automatically included in the @RestController. This means that we don't need to annotate our handler methods with the @ResponseBody. We need to do this in a @Controller class if we want to write response type directly to the HTTP response body (Ex: JSON or XML).
@Controller annotation example: in the below code snippet notice the @ResponseBody added to each of the handler methods in the return value.
@RequestMapping("/api/v1") public class EmployeeController { @Autowired private EmployeeRepository employeeRepository; @GetMapping("/employees") public @ResponseBody List<Employee> getAllEmployees() { // logic goes here } @GetMapping("/employees/{id}") public @ResponseBody ResponseEntity<Employee> getEmployeeById(@PathVariable(value = "id") Long employeeId) throws ResourceNotFoundException { // logic goes here } @PostMapping("/employees") public @ResponseBody Employee createEmployee(@Valid @RequestBody Employee employee) { // logic goes here } @PutMapping("/employees/{id}") public @ResponseBody ResponseEntity<Employee> updateEmployee(@PathVariable(value = "id") Long employeeId, @Valid @RequestBody Employee employeeDetails) throws ResourceNotFoundException { // logic goes here } @DeleteMapping("/employees/{id}") public @ResponseBody Map<String, Boolean> deleteEmployee(@PathVariable(value = "id") Long employeeId) throws ResourceNotFoundException { // logic goes here } }
To use @RestController in the above example, all we need to do is modify the @Controller to @RestController and remove the @ResponseBody from each method. The resultant class should look like the following:
@RestController @RequestMapping("/api/v1") public class EmployeeController { @Autowired private EmployeeRepository employeeRepository; @GetMapping("/employees") public List<Employee> getAllEmployees() { // logic goes here } @GetMapping("/employees/{id}") public ResponseEntity<Employee> getEmployeeById(@PathVariable(value = "id") Long employeeId) throws ResourceNotFoundException { // logic goes here } @PostMapping("/employees") public Employee createEmployee(@Valid @RequestBody Employee employee) { // logic goes here } @PutMapping("/employees/{id}") public ResponseEntity<Employee> updateEmployee(@PathVariable(value = "id") Long employeeId, @Valid @RequestBody Employee employeeDetails) throws ResourceNotFoundException { // logic goes here } @DeleteMapping("/employees/{id}") public Map<String, Boolean> deleteEmployee(@PathVariable(value = "id") Long employeeId) throws ResourceNotFoundException { // logic goes here } }
@RestController is a combination @Controller and @ResponseBody annotations.
References
Interview Questions
Java
Spring Boot
Spring Framework
Spring MVC
Comments
Post a Comment