diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java index 1224546f..99d79115 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultSchemaResourceGraphQlSourceBuilder.java @@ -166,15 +166,8 @@ final class DefaultSchemaResourceGraphQlSourceBuilder // visitors may transform the schema, for example to add Connection types. if (this.schemaReportConsumer != null) { - this.schemaReportRunner = (schema) -> { - SchemaMappingInspector.Initializer initializer = SchemaMappingInspector.initializer(); - if (this.typeResolver instanceof ClassNameTypeResolver cntr) { - initializer.classResolver(SchemaMappingInspector.ClassResolver.fromClassNameTypeResolver(cntr)); - } - this.inspectorInitializerConsumer.accept(initializer); - SchemaReport report = initializer.inspect(schema, runtimeWiring.getDataFetchers()); - this.schemaReportConsumer.accept(report); - }; + this.schemaReportRunner = (schema) -> + this.schemaReportConsumer.accept(createSchemaReport(schema, runtimeWiring)); } return (this.schemaFactory != null) ? @@ -239,6 +232,24 @@ final class DefaultSchemaResourceGraphQlSourceBuilder return (this.typeResolver != null) ? this.typeResolver : new ClassNameTypeResolver(); } + private SchemaReport createSchemaReport(GraphQLSchema schema, RuntimeWiring runtimeWiring) { + SchemaMappingInspector.Initializer initializer = SchemaMappingInspector.initializer(); + + // Add explicit mappings from ClassNameTypeResolver's + runtimeWiring.getTypeResolvers().values().stream().distinct().forEach((resolver) -> { + if (resolver instanceof ClassNameTypeResolver cntr) { + Map, String> mappings = cntr.getMappings(); + if (!mappings.isEmpty()) { + initializer.classResolver(SchemaMappingInspector.ClassResolver.create(mappings)); + } + } + }); + + this.inspectorInitializerConsumer.accept(initializer); + + return initializer.inspect(schema, runtimeWiring.getDataFetchers()); + } + @Override protected void applyGraphQlConfigurers(GraphQL.Builder builder) { super.applyGraphQlConfigurers(builder); diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java index 2024f983..259c452b 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/SchemaMappingInspector.java @@ -362,16 +362,12 @@ public final class SchemaMappingInspector { /** - * Create a resolver by re-using the explicit, reverse mappings of - * {@link ClassNameTypeResolver}. - * @param resolver the type resolver using class names + * Create a resolver from the given mappings. + * @param mappings from Class to GraphQL type name */ - static ClassResolver fromClassNameTypeResolver(ClassNameTypeResolver resolver) { - MappingClassResolver mappingResolver = new MappingClassResolver(); - resolver.getMappings().forEach((key, value) -> mappingResolver.addMapping(value, key)); - return mappingResolver; + static ClassResolver create(Map, String> mappings) { + return new MappingClassResolver(mappings); } - } @@ -415,8 +411,8 @@ public final class SchemaMappingInspector { private final MultiValueMap> map = new LinkedMultiValueMap<>(); - void addMapping(String typeName, Class clazz) { - this.map.add(typeName, clazz); + MappingClassResolver(Map, String> mappings) { + mappings.forEach((key, value) -> this.map.add(value, key)); } @Override diff --git a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java index f8cd6a33..d5deaeeb 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorInterfaceTests.java @@ -106,7 +106,7 @@ public class SchemaMappingInspectorInterfaceTests extends SchemaMappingInspector typeResolver.addMapping(CarImpl.class, "Car"); SchemaReport report = inspectSchema(schema, - initializer -> initializer.classResolver(ClassResolver.fromClassNameTypeResolver(typeResolver)), + initializer -> initializer.classResolver(ClassResolver.create(typeResolver.getMappings())), VehicleController.class); assertThatReport(report) diff --git a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java index 32350a1f..49cb350a 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/execution/SchemaMappingInspectorUnionTests.java @@ -120,7 +120,7 @@ public class SchemaMappingInspectorUnionTests extends SchemaMappingInspectorTest typeResolver.addMapping(PhotoImpl.class, "Photo"); SchemaReport report = inspectSchema(schema, - initializer -> initializer.classResolver(ClassResolver.fromClassNameTypeResolver(typeResolver)), + initializer -> initializer.classResolver(ClassResolver.create(typeResolver.getMappings())), SearchController.class); assertThatReport(report)