Skip to content

Commit

Permalink
Ony selectively apply NoRequestMappingAnnotation (#396)
Browse files Browse the repository at this point in the history
As `@RequestMapping` without `method` matches all methods.
  • Loading branch information
timtebeek authored Jul 26, 2023
1 parent eef8ab3 commit 4d39725
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,13 @@ private static class NoRequestMappingAnnotationVisitor extends JavaIsoVisitor<Ex
public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) {
J.Annotation a = super.visitAnnotation(annotation, ctx);
if (REQUEST_MAPPING_ANNOTATION_MATCHER.matches(a) && getCursor().getParentOrThrow().getValue() instanceof J.MethodDeclaration) {

Optional<J.Assignment> requestMethodArg = requestMethodArgument(a);
Optional<String> requestType = requestMethodArg.isPresent() ? requestMethodArg.flatMap(this::requestMethodType) : Optional.of("GET");
Optional<String> requestType = requestMethodArg.map(this::requestMethodType);
String resolvedRequestMappingAnnotationClassName = requestType.map(this::associatedRequestMapping).orElse(null);
if (resolvedRequestMappingAnnotationClassName == null) {
// Without a method argument @RequestMapping matches all request methods, so we can't safely convert
return a;
}

maybeRemoveImport("org.springframework.web.bind.annotation.RequestMapping");
maybeRemoveImport("org.springframework.web.bind.annotation.RequestMethod");
Expand Down Expand Up @@ -138,37 +141,31 @@ private boolean methodArgumentHasSingleType(J.Assignment assignment) {
return newArray.getInitializer() != null && newArray.getInitializer().size() == 1;
}

private Optional<String> requestMethodType(@Nullable J.Assignment assignment) {
String method;
if (assignment == null) {
method = "GET";
} else if (assignment.getAssignment() instanceof J.Identifier) {
method = ((J.Identifier) assignment.getAssignment()).getSimpleName();
private String requestMethodType(@Nullable J.Assignment assignment) {
if (assignment.getAssignment() instanceof J.Identifier) {
return ((J.Identifier) assignment.getAssignment()).getSimpleName();
} else if (assignment.getAssignment() instanceof J.FieldAccess) {
method = ((J.FieldAccess) assignment.getAssignment()).getSimpleName();
return ((J.FieldAccess) assignment.getAssignment()).getSimpleName();
} else if (methodArgumentHasSingleType(assignment)) {
J.NewArray newArray = (J.NewArray) assignment.getAssignment();
assert newArray.getInitializer() != null;
method = ((J.FieldAccess) newArray.getInitializer().get(0)).getSimpleName();
} else {
method = null;
return ((J.FieldAccess) newArray.getInitializer().get(0)).getSimpleName();
}
return Optional.ofNullable(method);
return null;
}

@Nullable
private String associatedRequestMapping(String method) {
String methodName = null;
switch (method) {
case "POST":
case "PUT":
case "DELETE":
case "PATCH":
case "GET":
methodName = method.charAt(0) + method.toLowerCase().substring(1) + "Mapping";
break;
return method.charAt(0) + method.toLowerCase().substring(1) + "Mapping";
}
return methodName;
// HEAD, OPTIONS, TRACE do not have associated RequestMapping variant
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public ResponseEntity<String> getUser(@PathVariable("id") Long id) {
return null;
}
@GetMapping
@RequestMapping
public ResponseEntity<List<String>> getUsersNoRequestMethod() {
return null;
}
Expand All @@ -117,6 +117,7 @@ void postMapping() {
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@RestController
@RequestMapping("/users")
Expand Down Expand Up @@ -157,6 +158,7 @@ void removeUnnecessaryAnnotation() {
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@RestController
public class UsersController {
Expand Down Expand Up @@ -194,6 +196,7 @@ void hasValueParameter() {
import java.util.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@RestController
@RequestMapping("/users")
Expand Down Expand Up @@ -296,10 +299,11 @@ void getMappingWithinNestedClass() {
java(
"""
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
class Test {
class Inner {
@RequestMapping("/api")
@RequestMapping(method = RequestMethod.GET, value = "/api")
void test() {
}
}
Expand Down

0 comments on commit 4d39725

Please sign in to comment.