Skip to content

Commit 1fde452

Browse files
christophstroblmp911de
authored andcommitted
Fix AOT code generation for managed types.
Closes #2704 Original pull request: #2705.
1 parent b55f098 commit 1fde452

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/main/java/org/springframework/data/aot/ManagedTypesRegistrationAotContribution.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.lang.reflect.Executable;
1919
import java.lang.reflect.Method;
20+
import java.util.Collections;
2021
import java.util.List;
2122
import java.util.function.BiConsumer;
2223

@@ -34,9 +35,12 @@
3435
import org.springframework.core.ResolvableType;
3536
import org.springframework.data.domain.ManagedTypes;
3637
import org.springframework.data.util.Lazy;
38+
import org.springframework.javapoet.ClassName;
3739
import org.springframework.javapoet.CodeBlock;
3840
import org.springframework.javapoet.MethodSpec.Builder;
3941
import org.springframework.javapoet.ParameterizedTypeName;
42+
import org.springframework.javapoet.TypeName;
43+
import org.springframework.javapoet.WildcardTypeName;
4044
import org.springframework.lang.Nullable;
4145
import org.springframework.util.ClassUtils;
4246
import org.springframework.util.ObjectUtils;
@@ -167,7 +171,15 @@ void generateInstanceFactory(Builder method) {
167171

168172
CodeBlock.Builder builder = CodeBlock.builder().add("return ").beginControlFlow("(registeredBean -> ");
169173

170-
builder.addStatement("var types = $T.of($L)", List.class, toCodeBlock(sourceTypes, allSourceTypesVisible));
174+
if(sourceTypes.isEmpty()) {
175+
176+
TypeName wildcard = WildcardTypeName.subtypeOf(Object.class);
177+
TypeName classOfAny = ParameterizedTypeName.get(ClassName.get(Class.class), wildcard);
178+
179+
builder.addStatement("var types = $T.<$T>emptyList()", Collections.class, classOfAny);
180+
} else {
181+
builder.addStatement("var types = $T.of($L)", List.class, toCodeBlock(sourceTypes, allSourceTypesVisible));
182+
}
171183

172184
if (allSourceTypesVisible) {
173185
builder.addStatement("var managedTypes = $T.fromIterable($L)", ManagedTypes.class, "types");

src/test/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessorUnitTests.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,28 @@ void generatesInstanceSupplierCodeFragmentToAvoidDuplicateInvocations() {
195195
});
196196
}
197197

198+
@Test // GH-2680
199+
void generatesInstanceSupplierCodeFragmentToAvoidDuplicateInvocationsForEmptyManagedTypes() {
200+
201+
beanFactory.registerBeanDefinition("commons.managed-types", BeanDefinitionBuilder.rootBeanDefinition(EmptyManagedTypes.class).getBeanDefinition());
202+
RegisteredBean registeredBean = RegisteredBean.of(beanFactory, "commons.managed-types");
203+
204+
BeanRegistrationAotContribution contribution = createPostProcessor("commons")
205+
.processAheadOfTime(RegisteredBean.of(beanFactory, "commons.managed-types"));
206+
207+
AotTestCodeContributionBuilder.withContextFor(this.getClass()).writeContentFor(contribution).compile(it -> {
208+
209+
210+
InstanceSupplier<ManagedTypes> types = ReflectionTestUtils
211+
.invokeMethod(it.getAllCompiledClasses().iterator().next(), "instance");
212+
try {
213+
assertThat(types.get(registeredBean).toList()).isEmpty();
214+
} catch (Exception e) {
215+
throw new RuntimeException(e);
216+
}
217+
});
218+
}
219+
198220
@Test // GH-2680
199221
void generatesInstanceSupplierCodeFragmentForTypeWithCustomFactoryMethod() {
200222

@@ -269,6 +291,22 @@ public void forEach(Consumer<Class<?>> action) {
269291
}
270292
}
271293

294+
public static class EmptyManagedTypes implements ManagedTypes {
295+
296+
public EmptyManagedTypes() {
297+
298+
}
299+
300+
public static EmptyManagedTypes of(ManagedTypes source) {
301+
return new EmptyManagedTypes();
302+
}
303+
304+
@Override
305+
public void forEach(Consumer<Class<?>> action) {
306+
307+
}
308+
}
309+
272310
public static class StoreManagedTypesWithCustomFactoryMethod implements ManagedTypes {
273311

274312
private ManagedTypes source;

0 commit comments

Comments
 (0)