From d9101ab48f79e133d7e18ba7a5e164d170e2e065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 11 Jan 2023 18:09:53 +0100 Subject: [PATCH] WIP --- .../factory/aot/BeanDefinitionMethodGenerator.java | 9 ++++++++- .../aot/BeanDefinitionMethodGeneratorTests.java | 12 +++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java index 94951852b943..ba38b589326c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import org.springframework.beans.factory.support.AutowireCandidateResolver; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RegisteredBean; +import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.MethodParameter; import org.springframework.javapoet.ClassName; import org.springframework.lang.Nullable; @@ -45,6 +46,7 @@ * * @author Phillip Webb * @author Stephane Nicoll + * @author Sebastien Deleuze * @since 6.0 * @see BeanDefinitionMethodGeneratorFactory */ @@ -68,12 +70,17 @@ class BeanDefinitionMethodGenerator { * @param registeredBean the registered bean * @param currentPropertyName the current property name * @param aotContributions the AOT contributions + * @throws IllegalArgumentException if the bean definition defines an instance supplier since this can't be supported for code generation */ BeanDefinitionMethodGenerator( BeanDefinitionMethodGeneratorFactory methodGeneratorFactory, RegisteredBean registeredBean, @Nullable String currentPropertyName, List aotContributions) { + RootBeanDefinition mbd = registeredBean.getMergedBeanDefinition(); + if (mbd.getInstanceSupplier() != null) { + throw new IllegalArgumentException("Code generation is not supported for bean definitions declaring an instance supplier callback : " + mbd); + } this.methodGeneratorFactory = methodGeneratorFactory; this.registeredBean = registeredBean; this.constructorOrFactoryMethod = registeredBean.resolveConstructorOrFactoryMethod(); diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java index f0d79dcad1af..581973601e7e 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,6 +58,7 @@ import org.springframework.javapoet.ParameterizedTypeName; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; /** * Tests for {@link BeanDefinitionMethodGenerator} and @@ -65,6 +66,7 @@ * * @author Phillip Webb * @author Stephane Nicoll + * @author Sebastien Deleuze */ class BeanDefinitionMethodGeneratorTests { @@ -491,6 +493,14 @@ void generateBeanDefinitionMethodWhenBeanIsOfPrimitiveType() { testBeanDefinitionMethodInCurrentFile(Boolean.class, beanDefinition); } + @Test + void throwExceptionWithInstanceSupplier() { + RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new)); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> new BeanDefinitionMethodGenerator( + this.methodGeneratorFactory, registeredBean, null, + Collections.emptyList())); + } + private void testBeanDefinitionMethodInCurrentFile(Class targetType, RootBeanDefinition beanDefinition) { RegisteredBean registeredBean = registerBean(new RootBeanDefinition(beanDefinition)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(