Skip to content

Commit 0748a12

Browse files
committed
Improve union support of SchemaMappingInspector
If the union controller method returns Object, as a fallback try the package of the controller. See gh-960
1 parent b8c4899 commit 0748a12

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949

5050
import org.springframework.beans.BeanUtils;
5151
import org.springframework.beans.BeansException;
52+
import org.springframework.core.MethodParameter;
5253
import org.springframework.core.ReactiveAdapter;
5354
import org.springframework.core.ReactiveAdapterRegistry;
5455
import org.springframework.core.ResolvableType;
@@ -522,6 +523,13 @@ private static void addReflectionClassResolver(
522523
int index = clazz.getName().indexOf(clazz.getSimpleName());
523524
resolver.addClassPrefix(outputTypeName, clazz.getName().substring(0, index));
524525
}
526+
else if (fieldEntry.getValue() instanceof SelfDescribingDataFetcher<?> sddf) {
527+
if (sddf.getReturnType().getSource() instanceof MethodParameter param) {
528+
clazz = param.getDeclaringClass();
529+
int index = clazz.getName().indexOf(clazz.getSimpleName());
530+
resolver.addClassPrefix(outputTypeName, clazz.getName().substring(0, index));
531+
}
532+
}
525533
}
526534
}
527535
}

spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public class SchemaMappingInspectorUnionTests extends SchemaMappingInspectorTest
5151
class InterfaceFieldsNotOnJavaInterface {
5252

5353
@Test
54-
void reportUnmappedFields() {
54+
void reportUnmappedFieldsByCheckingReturnTypePackage() {
5555
SchemaReport report = inspectSchema(schema, SearchController.class);
5656
assertThatReport(report)
5757
.hasSkippedTypeCount(0)
@@ -60,6 +60,16 @@ void reportUnmappedFields() {
6060
.containsUnmappedFields("Video", "title");
6161
}
6262

63+
@Test
64+
void reportUnmappedFieldsByCheckingControllerTypePackage() {
65+
SchemaReport report = inspectSchema(schema, ObjectSearchController.class);
66+
assertThatReport(report)
67+
.hasSkippedTypeCount(0)
68+
.hasUnmappedFieldCount(3)
69+
.containsUnmappedFields("Photo", "height", "width")
70+
.containsUnmappedFields("Video", "title");
71+
}
72+
6373

6474
sealed interface ResultItem permits Photo, Video { }
6575
record Photo() implements ResultItem { }
@@ -73,6 +83,16 @@ List<ResultItem> search() {
7383
throw new UnsupportedOperationException();
7484
}
7585
}
86+
87+
88+
@Controller
89+
static class ObjectSearchController {
90+
91+
@QueryMapping
92+
List<Object> search() {
93+
throw new UnsupportedOperationException();
94+
}
95+
}
7696
}
7797

7898

0 commit comments

Comments
 (0)