@@ -134,11 +134,14 @@ private void inspectSchemaType(GraphQLType type, @Nullable ResolvableType resolv
134
134
type = unwrapNonNull (type );
135
135
if (isConnectionType (type )) {
136
136
type = getConnectionNodeType (type );
137
- resolvableType = nest (resolvableType , type );
137
+ resolvableType = nestForConnection (resolvableType , type );
138
138
}
139
139
else if (type instanceof GraphQLList listType ) {
140
140
type = unwrapNonNull (listType .getWrappedType ());
141
- resolvableType = nest (resolvableType , type );
141
+ resolvableType = nestForList (resolvableType , type );
142
+ }
143
+ else {
144
+ resolvableType = (resolvableType != null ? nestIfReactive (resolvableType ) : null );
142
145
}
143
146
144
147
if (type instanceof GraphQLNamedOutputType outputType ) {
@@ -157,7 +160,7 @@ else if (type instanceof GraphQLList listType) {
157
160
}
158
161
return ;
159
162
}
160
- else if (resolvableType != null && resolveClassToCompare ( resolvableType ) == Object .class ) {
163
+ else if (resolvableType != null && resolvableType . resolve ( Object . class ) == Object .class ) {
161
164
if (logger .isDebugEnabled ()) {
162
165
logger .debug ("Skipped '" + getTypeName (type ) + "': " +
163
166
"inspection could not determine the Java object return type." );
@@ -208,10 +211,35 @@ private GraphQLType getConnectionNodeType(GraphQLType type) {
208
211
return type ;
209
212
}
210
213
211
- private static ResolvableType nest (@ Nullable ResolvableType resolvableType , GraphQLType type ) {
212
- Assert .notNull (resolvableType , "No declaredType for " + getTypeName (type ));
213
- resolvableType = resolvableType .getNested (2 );
214
- return resolvableType ;
214
+ private ResolvableType nestForConnection (@ Nullable ResolvableType type , GraphQLType graphQLType ) {
215
+ Assert .state (type != null , "No Java type for " + getTypeName (graphQLType ));
216
+ type = nestIfReactive (type );
217
+ Assert .state (type .hasGenerics (), "Expected type with generics: " + type );
218
+ return type .getNested (2 );
219
+ }
220
+
221
+ private ResolvableType nestIfReactive (ResolvableType type ) {
222
+ Class <?> clazz = type .resolve (Object .class );
223
+ ReactiveAdapter adapter = this .reactiveAdapterRegistry .getAdapter (clazz );
224
+ if (adapter != null ) {
225
+ Assert .state (!adapter .isNoValue (), "Expected value producing type: " + type );
226
+ return type .getNested (2 );
227
+ }
228
+ return type ;
229
+ }
230
+
231
+ private ResolvableType nestForList (@ Nullable ResolvableType type , GraphQLType graphQlType ) {
232
+ Assert .state (type != null , "No Java type for " + getTypeName (graphQlType ));
233
+ ReactiveAdapter adapter = this .reactiveAdapterRegistry .getAdapter (type .resolve (Object .class ));
234
+ if (adapter != null ) {
235
+ if (adapter .isMultiValue ()) {
236
+ return type .getNested (2 );
237
+ }
238
+ Assert .state (!adapter .isNoValue (), "Expected List compatible type: " + type );
239
+ type = type .getNested (2 );
240
+ }
241
+ Assert .state (type .isArray () || type .hasGenerics (), "Expected List compatible type: " + type );
242
+ return type .getNested (2 );
215
243
}
216
244
217
245
private static String getTypeName (GraphQLType type ) {
@@ -224,7 +252,7 @@ private static boolean isNotScalarOrEnumType(GraphQLType type) {
224
252
225
253
private boolean hasProperty (ResolvableType resolvableType , String fieldName ) {
226
254
try {
227
- Class <?> clazz = resolveClassToCompare ( resolvableType );
255
+ Class <?> clazz = resolvableType . resolve ( Object . class );
228
256
return (BeanUtils .getPropertyDescriptor (clazz , fieldName ) != null );
229
257
}
230
258
catch (BeansException ex ) {
@@ -233,12 +261,6 @@ private boolean hasProperty(ResolvableType resolvableType, String fieldName) {
233
261
}
234
262
}
235
263
236
- private Class <?> resolveClassToCompare (ResolvableType resolvableType ) {
237
- Class <?> clazz = resolvableType .resolve (Object .class );
238
- ReactiveAdapter adapter = this .reactiveAdapterRegistry .getAdapter (clazz );
239
- return (adapter != null ? resolvableType .getNested (2 ).resolve (Object .class ) : clazz );
240
- }
241
-
242
264
@ SuppressWarnings ("rawtypes" )
243
265
private void inspectDataFetcherRegistrations () {
244
266
this .runtimeWiring .getDataFetchers ().forEach ((typeName , registrations ) ->
0 commit comments