From 0a48984fab3657727ab5ed2766186f7486fe4a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 16 Sep 2025 16:08:15 +0200 Subject: [PATCH] Suppress deprecating warnings for getInstanceSupplier() method as well This commit fixes code generation for a bean produced by a protected factory method. Previously only the code generated for public methods, i.e. without a dedicated instance supplier method, was handled. Closes gh-35486 --- .../aot/InstanceSupplierCodeGenerator.java | 3 ++ .../InstanceSupplierCodeGeneratorTests.java | 30 +++++++++++++++++++ ...precatedForRemovalMemberConfiguration.java | 10 +++++++ .../DeprecatedMemberConfiguration.java | 5 ++++ 4 files changed, 48 insertions(+) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGenerator.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGenerator.java index 91a84acf0c2..b19b34218e2 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGenerator.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGenerator.java @@ -294,9 +294,12 @@ public class InstanceSupplierCodeGenerator { this.generationContext.getRuntimeHints().reflection().registerMethod(factoryMethod, ExecutableMode.INVOKE); GeneratedMethod getInstanceMethod = generateGetInstanceSupplierMethod(method -> { + CodeWarnings codeWarnings = new CodeWarnings(); Class suppliedType = ClassUtils.resolvePrimitiveIfNecessary(factoryMethod.getReturnType()); + codeWarnings.detectDeprecation(suppliedType, factoryMethod); method.addJavadoc("Get the bean instance supplier for '$L'.", beanName); method.addModifiers(PRIVATE_STATIC); + codeWarnings.suppress(method); method.returns(ParameterizedTypeName.get(BeanInstanceSupplier.class, suppliedType)); method.addStatement(generateInstanceSupplierForFactoryMethod( factoryMethod, suppliedType, targetClass, factoryMethod.getName())); diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGeneratorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGeneratorTests.java index 8ab92b8f97e..57e72aa3ed0 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGeneratorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/InstanceSupplierCodeGeneratorTests.java @@ -418,6 +418,16 @@ class InstanceSupplierCodeGeneratorTests { compileAndCheckWarnings(beanDefinition); } + @Test + void generateWhenTargetFactoryMethodIsProtectedAndReturnTypeIsDeprecated() { + BeanDefinition beanDefinition = BeanDefinitionBuilder + .rootBeanDefinition(DeprecatedBean.class) + .setFactoryMethodOnBean("deprecatedReturnTypeProtected", "config").getBeanDefinition(); + beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder + .genericBeanDefinition(DeprecatedMemberConfiguration.class).getBeanDefinition()); + compileAndCheckWarnings(beanDefinition); + } + private void compileAndCheckWarnings(BeanDefinition beanDefinition) { assertThatNoException().isThrownBy(() -> compile(TEST_COMPILER, beanDefinition, ((instanceSupplier, compiled) -> {}))); @@ -464,6 +474,26 @@ class InstanceSupplierCodeGeneratorTests { compileAndCheckWarnings(beanDefinition); } + @Test + void generateWhenTargetFactoryMethodReturnTypeIsDeprecatedForRemoval() { + BeanDefinition beanDefinition = BeanDefinitionBuilder + .rootBeanDefinition(DeprecatedForRemovalBean.class) + .setFactoryMethodOnBean("deprecatedReturnType", "config").getBeanDefinition(); + beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder + .genericBeanDefinition(DeprecatedForRemovalMemberConfiguration.class).getBeanDefinition()); + compileAndCheckWarnings(beanDefinition); + } + + @Test + void generateWhenTargetFactoryMethodIsProtectedAndReturnTypeIsDeprecatedForRemoval() { + BeanDefinition beanDefinition = BeanDefinitionBuilder + .rootBeanDefinition(DeprecatedForRemovalBean.class) + .setFactoryMethodOnBean("deprecatedReturnTypeProtected", "config").getBeanDefinition(); + beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder + .genericBeanDefinition(DeprecatedForRemovalMemberConfiguration.class).getBeanDefinition()); + compileAndCheckWarnings(beanDefinition); + } + private void compileAndCheckWarnings(BeanDefinition beanDefinition) { assertThatNoException().isThrownBy(() -> compile(TEST_COMPILER, beanDefinition, ((instanceSupplier, compiled) -> {}))); diff --git a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedForRemovalMemberConfiguration.java b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedForRemovalMemberConfiguration.java index eabb3609214..68c077a8e81 100644 --- a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedForRemovalMemberConfiguration.java +++ b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedForRemovalMemberConfiguration.java @@ -33,4 +33,14 @@ public class DeprecatedForRemovalMemberConfiguration { return bean.toString(); } + @SuppressWarnings("removal") + public DeprecatedForRemovalBean deprecatedReturnType() { + return new DeprecatedForRemovalBean(); + } + + @SuppressWarnings("removal") + DeprecatedForRemovalBean deprecatedReturnTypeProtected() { + return new DeprecatedForRemovalBean(); + } + } diff --git a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedMemberConfiguration.java b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedMemberConfiguration.java index 96c3a345395..3508df0a88d 100644 --- a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedMemberConfiguration.java +++ b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/factory/generator/deprecation/DeprecatedMemberConfiguration.java @@ -38,4 +38,9 @@ public class DeprecatedMemberConfiguration { return new DeprecatedBean(); } + @SuppressWarnings("deprecation") + DeprecatedBean deprecatedReturnTypeProtected() { + return new DeprecatedBean(); + } + }