== Why is this an issue?

Classes annotated as `@Controller` in Spring are responsible for handling incoming web requests.
When annotating methods or the entire controller with `@ResponseBody`, the return value of said methods will be serialized and set as the response body.
In other words, it tells the Spring framework that this method does not produce a view.
This mechanism is commonly used to create API endpoints.

Spring provides `@RestController` as a convenient annotation to replace the combination of `@Controller` and `@ResponseBody`.
The two are functionally identical, so the single annotation approach is preferred.

This rule will raise an issue on a class that is annotated with `@Controller` if:

* the class is also annotated with `@ResponseBody` or
* all methods in said class are annotated with `@ResponseBody`.

== How to fix it

Replace the `@Controller` annotation with the `@RestController` annotation and remove all `@ResponseBody` annotations from the class and its methods.

=== Code examples

==== Noncompliant code example

[source,java,diff-id=1,diff-type=noncompliant]
----
@Controller
@ResponseBody
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}
----

==== Compliant solution

[source,java,diff-id=1,diff-type=compliant]
----
@RestController
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}
----

==== Noncompliant code example

[source,java,diff-id=2,diff-type=noncompliant]
----
@Controller
public class MyController {
    @ResponseBody
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }

    @ResponseBody
    @GetMapping("/foo")
    public String foo() {
        return "Foo";
    }
}
----

==== Compliant solution

[source,java,diff-id=2,diff-type=compliant]
----
@RestController
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }

    @GetMapping("/foo")
    public String foo() {
        return "Foo";
    }
}
----

== Resources

=== Articles & blog posts

* Spring Guides - https://spring.io/guides/gs/rest-service/[Building a RESTful Web Service]
* Baeldung - https://www.baeldung.com/spring-controller-vs-restcontroller[The Spring @Controller and @RestController Annotations]
* Baeldung - https://www.baeldung.com/spring-request-response-body[Spring's RequestBody and ResponseBody Annotations]
