Refine instance supplier check in BeanDefinitionMethodGenerator
This commit refines the instance supplier check in BeanDefinitionMethodGenerator constructor in order to allow overriding by an AOT contribution. Closes gh-29556
This commit is contained in:
@@ -78,7 +78,7 @@ class BeanDefinitionMethodGenerator {
|
||||
List<BeanRegistrationAotContribution> aotContributions) {
|
||||
|
||||
RootBeanDefinition mbd = registeredBean.getMergedBeanDefinition();
|
||||
if (mbd.getInstanceSupplier() != null) {
|
||||
if (mbd.getInstanceSupplier() != null && aotContributions.isEmpty()) {
|
||||
throw new IllegalArgumentException("Code generation is not supported for bean definitions declaring an instance supplier callback : " + mbd);
|
||||
}
|
||||
this.methodGeneratorFactory = methodGeneratorFactory;
|
||||
|
||||
@@ -105,6 +105,23 @@ class BeanDefinitionMethodGeneratorTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test // gh-29556
|
||||
void generateBeanDefinitionMethodGeneratesMethodWithInstanceSupplier() {
|
||||
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
|
||||
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
|
||||
this.methodGeneratorFactory, registeredBean, null,
|
||||
List.of((generationContext, beanRegistrationCode) -> { }));
|
||||
MethodReference method = generator.generateBeanDefinitionMethod(
|
||||
this.generationContext, this.beanRegistrationsCode);
|
||||
compile(method, (actual, compiled) -> {
|
||||
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
|
||||
assertThat(sourceFile).contains("Get the bean definition for 'testBean'");
|
||||
assertThat(sourceFile).contains("beanType = TestBean.class");
|
||||
assertThat(sourceFile).contains("setInstanceSupplier(TestBean::new)");
|
||||
assertThat(actual).isInstanceOf(RootBeanDefinition.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void generateBeanDefinitionMethodWhenHasInnerClassTargetMethodGeneratesMethod() {
|
||||
this.beanFactory.registerBeanDefinition("testBeanConfiguration", new RootBeanDefinition(
|
||||
@@ -493,8 +510,8 @@ class BeanDefinitionMethodGeneratorTests {
|
||||
testBeanDefinitionMethodInCurrentFile(Boolean.class, beanDefinition);
|
||||
}
|
||||
|
||||
@Test
|
||||
void throwExceptionWithInstanceSupplier() {
|
||||
@Test // gh-29556
|
||||
void throwExceptionWithInstanceSupplierWithoutAotContribution() {
|
||||
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new BeanDefinitionMethodGenerator(
|
||||
this.methodGeneratorFactory, registeredBean, null,
|
||||
|
||||
Reference in New Issue
Block a user