94 lines
2.4 KiB
Plaintext
94 lines
2.4 KiB
Plaintext
== 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]
|