Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ class DgsSchemaProvider
runtimeWiringBuilder.codeRegistry(codeRegistryBuilder.build())

dgsComponents.forEach { dgsComponent -> invokeDgsRuntimeWiring(dgsComponent, runtimeWiringBuilder) }
checkUnregisteredTypeResolvers(runtimeWiringBuilder, mergedRegistry)

val runtimeWiring = runtimeWiringBuilder.build()

Expand Down Expand Up @@ -782,8 +783,6 @@ class DgsSchemaProvider
runtimeWiringBuilder: RuntimeWiring.Builder,
mergedRegistry: TypeDefinitionRegistry,
) {
val registeredTypeResolvers = mutableSetOf<String>()

dgsComponents.forEach { dgsComponent ->
dgsComponent
.annotatedMethods<DgsTypeResolver>()
Expand Down Expand Up @@ -815,8 +814,6 @@ class DgsSchemaProvider
}
// do not add the default resolver if another resolver with the same name is present
if (defaultTypeResolver == null || !overrideTypeResolver) {
registeredTypeResolvers += annotation.name

val dgsComponentInstance = dgsComponent.instance
runtimeWiringBuilder.type(
TypeRuntimeWiring
Expand All @@ -838,6 +835,15 @@ class DgsSchemaProvider
}
}
}
}

private fun checkUnregisteredTypeResolvers(
runtimeWiringBuilder: RuntimeWiring.Builder,
mergedRegistry: TypeDefinitionRegistry,
) {
// Build the RuntimeWiring to get access to registered type resolvers
val runtimeWiring = runtimeWiringBuilder.build()
val registeredTypeResolvers = runtimeWiring.typeResolvers.keys

// Add a fallback type resolver for types that don't have a type resolver registered.
// This works when the Java type has the same name as the GraphQL type.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1365,6 +1365,15 @@ internal class DgsSchemaProviderTest {
}
}

@Test
fun `StrictMode should not fail when enabled and @DgsRuntimeWiring registers type resolver`() {
val locations = listOf("classpath:union/union.graphqls")
contextRunner.withBeans(RegisterTypeResolverWithRuntimeWiring::class).run { context ->
val schemaProvider = schemaProvider(applicationContext = context, schemaLocations = locations, strictMode = true)
assertDoesNotThrow { schemaProvider.schema() }
}
}

@DgsComponent
class DuplicateScalarWiring {
@DgsRuntimeWiring
Expand All @@ -1391,4 +1400,22 @@ internal class DgsSchemaProviderTest {
return builder
}
}

@DgsComponent
class RegisterTypeResolverWithRuntimeWiring {
@DgsRuntimeWiring
fun customWiring(builder: RuntimeWiring.Builder): RuntimeWiring.Builder {
builder.type("RequestType") { type ->
type.typeResolver { env ->
env.schema.getObjectType("RequestType")
}
}
builder.type("ResultType") { type ->
type.typeResolver { env ->
env.schema.getObjectType("ResultType")
}
}
return builder
}
}
}
33 changes: 33 additions & 0 deletions graphql-dgs/src/test/resources/union/union.graphqls
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
interface RequestType {
name: String
}

type RequestType1 implements RequestType {
name: String
description: String
}

type RequestType2 implements RequestType {
name: String
flag: Boolean
}

type ResultType1 {
message: String
}

type ResultType2 {
code: String
description: String
}

type ResultType3 {
message: String
code: String
flag: Boolean
}

union ResultType =
ResultType1 |
ResultType2 |
ResultType3
Loading