Skip to content

Commit fa9e85e

Browse files
committed
Add hints for enclosing supertypes, generics and enclosing classes.
Signed-off-by: Olga Maciaszek-Sharma <[email protected]>
1 parent cb06e3f commit fa9e85e

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcRuntimeHintsProcessor.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package org.springframework.cloud.gateway.server.mvc.config;
1818

19+
import java.util.Arrays;
1920
import java.util.Collections;
2021
import java.util.HashSet;
2122
import java.util.Map;
23+
import java.util.Objects;
2224
import java.util.Set;
2325
import java.util.stream.Collectors;
2426
import java.util.stream.Stream;
@@ -35,6 +37,7 @@
3537
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3638
import org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions;
3739
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
40+
import org.springframework.core.ResolvableType;
3841
import org.springframework.core.type.filter.AssignableTypeFilter;
3942

4043
/**
@@ -85,6 +88,34 @@ public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableL
8588
}
8689

8790
private static Set<Class<?>> getTypesToRegister(String packageName) {
91+
Set<Class<?>> classesToAdd = getClassesToAdd(packageName);
92+
Set<Class<?>> genericsToAdd = new HashSet<>();
93+
Set<Class<?>> superTypes = new HashSet<>();
94+
Set<Class<?>> enclosingClasses = new HashSet<>();
95+
for (Class<?> clazz : classesToAdd) {
96+
ResolvableType resolvableType = ResolvableType.forType(clazz);
97+
addGenericsForClass(genericsToAdd, resolvableType);
98+
addSuperTypesForClass(resolvableType, superTypes, genericsToAdd);
99+
addEnclosingClassesForClass(enclosingClasses, resolvableType.getRawClass());
100+
}
101+
classesToAdd.addAll(genericsToAdd);
102+
classesToAdd.addAll(superTypes);
103+
classesToAdd.addAll(enclosingClasses);
104+
return classesToAdd.stream().filter(Objects::nonNull).collect(Collectors.toSet());
105+
}
106+
107+
private static void addEnclosingClassesForClass(Set<Class<?>> enclosingClasses, Class<?> clazz) {
108+
if (clazz == null) {
109+
return;
110+
}
111+
Class<?> enclosing = clazz.getEnclosingClass();
112+
if (enclosing != null) {
113+
enclosingClasses.add(enclosing);
114+
addEnclosingClassesForClass(enclosingClasses, enclosing);
115+
}
116+
}
117+
118+
private static Set<Class<?>> getClassesToAdd(String packageName) {
88119
Set<Class<?>> classesToAdd = new HashSet<>();
89120
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
90121
provider.addIncludeFilter(new AssignableTypeFilter(Object.class));
@@ -106,6 +137,24 @@ private static Set<Class<?>> getTypesToRegister(String packageName) {
106137
return classesToAdd;
107138
}
108139

140+
private static void addGenericsForClass(Set<Class<?>> genericsToAdd, ResolvableType resolvableType) {
141+
if (resolvableType.getSuperType().hasGenerics()) {
142+
genericsToAdd.addAll(Arrays.stream(resolvableType.getSuperType().getGenerics())
143+
.map(ResolvableType::toClass)
144+
.collect(Collectors.toSet()));
145+
}
146+
}
147+
148+
private static void addSuperTypesForClass(ResolvableType resolvableType, Set<Class<?>> supertypesToAdd,
149+
Set<Class<?>> genericsToAdd) {
150+
ResolvableType superType = resolvableType.getSuperType();
151+
if (!ResolvableType.NONE.equals(superType)) {
152+
addGenericsForClass(genericsToAdd, superType);
153+
supertypesToAdd.add(superType.toClass());
154+
addSuperTypesForClass(superType, supertypesToAdd, genericsToAdd);
155+
}
156+
}
157+
109158
private static boolean shouldRegisterClass(Class<?> clazz) {
110159
Set<String> conditionClasses = beansConditionalOnClasses.getOrDefault(clazz.getName(), Collections.emptySet());
111160
for (String conditionClass : conditionClasses) {

0 commit comments

Comments
 (0)