diff --git a/src/main/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCode.java b/src/main/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCode.java index fd15241e..e91497b0 100644 --- a/src/main/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCode.java +++ b/src/main/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCode.java @@ -21,7 +21,8 @@ import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeTree; @@ -44,21 +45,19 @@ public String getDescription() { return "With Spring 6 `HttpStatus` was replaced by `HttpStatusCode` in most method signatures in the `ResponseEntityExceptionHandler`."; } + + private static final MethodMatcher HANDLER_METHOD = new MethodMatcher( + "org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler *(..)", true); + @Override public TreeVisitor getVisitor() { return Preconditions.check( - new UsesType<>("org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler", true), + new UsesMethod<>(HANDLER_METHOD), new JavaIsoVisitor() { @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) { J.MethodDeclaration m = super.visitMethodDeclaration(method, ctx); - boolean isOverride = false; - for (J.Annotation ann : method.getLeadingAnnotations()) { - if (TypeUtils.isAssignableTo("java.lang.Override", ann.getType())) { - isOverride = true; - } - } - if (isOverride) { + if (HANDLER_METHOD.matches(m.getMethodType()) && hasHttpStatusParameter(m)) { final JavaType.Method met = m.getMethodType().withParameterTypes(ListUtils.map(m.getMethodType().getParameterTypes(), type -> { if (TypeUtils.isAssignableTo(HTTP_STATUS_FQ, type)) { return JavaType.buildType(HTTP_STATUS_CODE_FQ); @@ -88,6 +87,12 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex maybeRemoveImport(HTTP_STATUS_FQ); return m; } + + private boolean hasHttpStatusParameter(J.MethodDeclaration m) { + return m.getParameters().stream().anyMatch(p -> + p instanceof J.VariableDeclarations && + TypeUtils.isAssignableTo(HTTP_STATUS_FQ, ((J.VariableDeclarations) p).getType())); + } } ); } diff --git a/src/testWithSpringBoot_3_0/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCodeTest.java b/src/testWithSpringBoot_3_0/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCodeTest.java index e787b6ad..68e8644c 100644 --- a/src/testWithSpringBoot_3_0/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCodeTest.java +++ b/src/testWithSpringBoot_3_0/java/org/openrewrite/java/spring/boot3/MigrateResponseEntityExceptionHandlerHttpStatusToHttpStatusCodeTest.java @@ -43,9 +43,9 @@ void migrateHttpStatustoHttpStatusCode() { import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; - + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { - + @Override protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { return super.handleExceptionInternal(ex, body, headers, status, request); @@ -58,11 +58,93 @@ protected ResponseEntity handleExceptionInternal(Exception ex, Object bo import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @Override + protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatusCode status, WebRequest request) { + return super.handleExceptionInternal(ex, body, headers, status, request); + } + } + """ + ) + ); + } + @Test + void convertHttpUsageAsInt() { + //language=java + rewriteRun( + java( + """ + import org.springframework.http.HttpHeaders; + import org.springframework.http.HttpStatus; + import org.springframework.http.ResponseEntity; + import org.springframework.web.context.request.WebRequest; + import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @Override + protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { + int value = status.value(); + return super.handleExceptionInternal(ex, body, headers, status, request); + } + } + """, + """ + import org.springframework.http.HttpHeaders; + import org.springframework.http.HttpStatusCode; + import org.springframework.http.ResponseEntity; + import org.springframework.web.context.request.WebRequest; + import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @Override + protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatusCode status, WebRequest request) { + int value = status.value(); + return super.handleExceptionInternal(ex, body, headers, status, request); + } + } + """ + ) + ); + } + @Test + void convertHttpUsageAsEnum() { + //language=java + rewriteRun( + java( + """ + import org.springframework.http.HttpHeaders; + import org.springframework.http.HttpStatus; + import org.springframework.http.ResponseEntity; + import org.springframework.web.context.request.WebRequest; + import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @Override + protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { + HttpStatus enumValue = status.value(); + return super.handleExceptionInternal(ex, body, headers, status, request); + } + } + """, + """ + import org.springframework.http.HttpHeaders; + import org.springframework.http.HttpStatusCode; + import org.springframework.http.ResponseEntity; + import org.springframework.web.context.request.WebRequest; + import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + + class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + @Override protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatusCode status, WebRequest request) { + HttpStatus enumValue = HttpStatus.valueOf(status.value()); return super.handleExceptionInternal(ex, body, headers, status, request); } }