1616
1717package org .springframework .cloud .gateway .server .mvc .config ;
1818
19+ import java .util .Arrays ;
1920import java .util .Collections ;
2021import java .util .HashSet ;
2122import java .util .Map ;
23+ import java .util .Objects ;
2224import java .util .Set ;
2325import java .util .stream .Collectors ;
2426import java .util .stream .Stream ;
3537import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
3638import org .springframework .cloud .gateway .server .mvc .filter .FilterFunctions ;
3739import org .springframework .context .annotation .ClassPathScanningCandidateComponentProvider ;
40+ import org .springframework .core .ResolvableType ;
3841import 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