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,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