Skip to content

Commit cd2c71d

Browse files
committed
Invoke checkTypeResolverExists() after @DgsRuntimeWiring
Closes gh-2180
1 parent 1df1c25 commit cd2c71d

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ class DgsSchemaProvider
262262
runtimeWiringBuilder.codeRegistry(codeRegistryBuilder.build())
263263

264264
dgsComponents.forEach { dgsComponent -> invokeDgsRuntimeWiring(dgsComponent, runtimeWiringBuilder) }
265+
checkUnregisteredTypeResolvers(runtimeWiringBuilder, mergedRegistry)
265266

266267
val runtimeWiring = runtimeWiringBuilder.build()
267268

@@ -782,8 +783,6 @@ class DgsSchemaProvider
782783
runtimeWiringBuilder: RuntimeWiring.Builder,
783784
mergedRegistry: TypeDefinitionRegistry,
784785
) {
785-
val registeredTypeResolvers = mutableSetOf<String>()
786-
787786
dgsComponents.forEach { dgsComponent ->
788787
dgsComponent
789788
.annotatedMethods<DgsTypeResolver>()
@@ -815,8 +814,6 @@ class DgsSchemaProvider
815814
}
816815
// do not add the default resolver if another resolver with the same name is present
817816
if (defaultTypeResolver == null || !overrideTypeResolver) {
818-
registeredTypeResolvers += annotation.name
819-
820817
val dgsComponentInstance = dgsComponent.instance
821818
runtimeWiringBuilder.type(
822819
TypeRuntimeWiring
@@ -838,6 +835,15 @@ class DgsSchemaProvider
838835
}
839836
}
840837
}
838+
}
839+
840+
private fun checkUnregisteredTypeResolvers(
841+
runtimeWiringBuilder: RuntimeWiring.Builder,
842+
mergedRegistry: TypeDefinitionRegistry,
843+
) {
844+
// Build the RuntimeWiring to get access to registered type resolvers
845+
val runtimeWiring = runtimeWiringBuilder.build()
846+
val registeredTypeResolvers = runtimeWiring.typeResolvers.keys
841847

842848
// Add a fallback type resolver for types that don't have a type resolver registered.
843849
// This works when the Java type has the same name as the GraphQL type.

graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/DgsSchemaProviderTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,15 @@ internal class DgsSchemaProviderTest {
13651365
}
13661366
}
13671367

1368+
@Test
1369+
fun `StrictMode should not fail when enabled and @DgsRuntimeWiring registers type resolver`() {
1370+
val locations = listOf("classpath:union/union.graphqls")
1371+
contextRunner.withBeans(RegisterTypeResolverWithRuntimeWiring::class).run { context ->
1372+
val schemaProvider = schemaProvider(applicationContext = context, schemaLocations = locations, strictMode = true)
1373+
assertDoesNotThrow { schemaProvider.schema() }
1374+
}
1375+
}
1376+
13681377
@DgsComponent
13691378
class DuplicateScalarWiring {
13701379
@DgsRuntimeWiring
@@ -1391,4 +1400,17 @@ internal class DgsSchemaProviderTest {
13911400
return builder
13921401
}
13931402
}
1403+
1404+
@DgsComponent
1405+
class RegisterTypeResolverWithRuntimeWiring {
1406+
@DgsRuntimeWiring
1407+
fun customWiring(builder: RuntimeWiring.Builder): RuntimeWiring.Builder {
1408+
builder.type("ResultType") { type ->
1409+
type.typeResolver { env ->
1410+
env.schema.getObjectType("ResultType")
1411+
}
1412+
}
1413+
return builder
1414+
}
1415+
}
13941416
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
type ResultType1 {
2+
message: String
3+
}
4+
5+
type ResultType2 {
6+
code: String
7+
description: String
8+
}
9+
10+
type ResultType3 {
11+
message: String
12+
code: String
13+
flag: Boolean
14+
}
15+
16+
union ResultType =
17+
ResultType1 |
18+
ResultType2 |
19+
ResultType3

0 commit comments

Comments
 (0)