Skip to content

Commit 7404e97

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

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

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

Lines changed: 48 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,33 @@ 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+
return classesToAdd.stream().filter(Objects::nonNull).collect(Collectors.toSet());
104+
}
105+
106+
private static void addEnclosingClassesForClass(Set<Class<?>> enclosingClasses, Class<?> clazz) {
107+
if (clazz == null) {
108+
return;
109+
}
110+
Class<?> enclosing = clazz.getEnclosingClass();
111+
if (enclosing != null) {
112+
enclosingClasses.add(enclosing);
113+
addEnclosingClassesForClass(enclosingClasses, enclosing);
114+
}
115+
}
116+
117+
private static Set<Class<?>> getClassesToAdd(String packageName) {
88118
Set<Class<?>> classesToAdd = new HashSet<>();
89119
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
90120
provider.addIncludeFilter(new AssignableTypeFilter(Object.class));
@@ -106,6 +136,24 @@ private static Set<Class<?>> getTypesToRegister(String packageName) {
106136
return classesToAdd;
107137
}
108138

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

0 commit comments

Comments
 (0)