From d39cf28d61e96090b386acdf3cc1635f19cc2d52 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 15 Jan 2024 13:36:33 +0100 Subject: [PATCH] Keep `@Autowired` on classes annotated with `@ConfigurationProperties` As discovered on https://github.com/conductor-oss/conductor/pull/36#issuecomment-1885443591 --- .../java/spring/NoAutowiredOnConstructor.java | 6 +++++ .../spring/NoAutowiredOnConstructorTest.java | 24 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/spring/NoAutowiredOnConstructor.java b/src/main/java/org/openrewrite/java/spring/NoAutowiredOnConstructor.java index 19cbf45d6..7228fd67d 100644 --- a/src/main/java/org/openrewrite/java/spring/NoAutowiredOnConstructor.java +++ b/src/main/java/org/openrewrite/java/spring/NoAutowiredOnConstructor.java @@ -23,6 +23,7 @@ import org.openrewrite.java.AnnotationMatcher; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.RemoveAnnotationVisitor; +import org.openrewrite.java.search.FindAnnotations; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.Statement; @@ -59,6 +60,11 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex } } + // `@ConfigurationProperties` classes usually use field injection, so keep `@Autowired` on constructors + if (!FindAnnotations.find(cd, "@org.springframework.boot.context.properties.ConfigurationProperties").isEmpty()) { + return cd; + } + return cd.withBody(cd.getBody().withStatements( ListUtils.map(cd.getBody().getStatements(), s -> { if (!isConstructor(s)) { diff --git a/src/testWithSpringBoot_1_5/java/org/openrewrite/java/spring/NoAutowiredOnConstructorTest.java b/src/testWithSpringBoot_1_5/java/org/openrewrite/java/spring/NoAutowiredOnConstructorTest.java index 6d9475507..b3e83e67d 100644 --- a/src/testWithSpringBoot_1_5/java/org/openrewrite/java/spring/NoAutowiredOnConstructorTest.java +++ b/src/testWithSpringBoot_1_5/java/org/openrewrite/java/spring/NoAutowiredOnConstructorTest.java @@ -29,7 +29,7 @@ class NoAutowiredOnConstructorTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipe(new NoAutowiredOnConstructor()) - .parser(JavaParser.fromJavaVersion().classpath("spring-beans", "spring-context", "spring-core")); + .parser(JavaParser.fromJavaVersion().classpath("spring-beans", "spring-boot", "spring-context", "spring-core")); } @Issue("https://github.com/openrewrite/rewrite-spring/issues/78") @@ -538,4 +538,26 @@ public DatabaseConfiguration(DataSource dataSource) { ) ); } + + @Test + void ignoreConfigurationProperties() { + //language=java + rewriteRun( + java( + """ + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.boot.context.properties.ConfigurationProperties; + import org.springframework.core.env.Environment; + @ConfigurationProperties + public class ArchivingWorkflowListenerProperties { + private final Environment environment; + @Autowired + public ArchivingWorkflowListenerProperties(Environment environment) { + this.environment = environment; + } + } + """ + ) + ); + } }