Skip to content

Commit ae26a82

Browse files
committed
Add support for custom missing field resolver handler.
1 parent 043b24a commit ae26a82

File tree

4 files changed

+48
-17
lines changed

4 files changed

+48
-17
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package graphql.kickstart.tools
2+
3+
import graphql.schema.DataFetchingEnvironment
4+
5+
interface MissingFieldHandler {
6+
fun resolve(env: DataFetchingEnvironment?): Any?
7+
}

src/main/kotlin/graphql/kickstart/tools/SchemaParserOptions.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@ import kotlin.coroutines.CoroutineContext
1919
import kotlin.reflect.KClass
2020

2121
data class SchemaParserOptions internal constructor(
22-
val contextClass: Class<*>?,
23-
val genericWrappers: List<GenericWrapper>,
24-
val allowUnimplementedResolvers: Boolean,
25-
val objectMapperProvider: PerFieldObjectMapperProvider,
26-
val proxyHandlers: List<ProxyHandler>,
27-
val inputArgumentOptionalDetectOmission: Boolean,
28-
val preferGraphQLResolver: Boolean,
29-
val introspectionEnabled: Boolean,
30-
val coroutineContextProvider: CoroutineContextProvider,
31-
val typeDefinitionFactories: List<TypeDefinitionFactory>,
32-
val fieldVisibility: GraphqlFieldVisibility?
22+
val contextClass: Class<*>?,
23+
val genericWrappers: List<GenericWrapper>,
24+
val missingFieldHandler: MissingFieldHandler?,
25+
val allowUnimplementedResolvers: Boolean,
26+
val objectMapperProvider: PerFieldObjectMapperProvider,
27+
val proxyHandlers: List<ProxyHandler>,
28+
val inputArgumentOptionalDetectOmission: Boolean,
29+
val preferGraphQLResolver: Boolean,
30+
val introspectionEnabled: Boolean,
31+
val coroutineContextProvider: CoroutineContextProvider,
32+
val typeDefinitionFactories: List<TypeDefinitionFactory>,
33+
val fieldVisibility: GraphqlFieldVisibility?
3334
) {
3435
companion object {
3536
@JvmStatic
@@ -47,6 +48,7 @@ data class SchemaParserOptions internal constructor(
4748
private var contextClass: Class<*>? = null
4849
private val genericWrappers: MutableList<GenericWrapper> = mutableListOf()
4950
private var useDefaultGenericWrappers = true
51+
private var missingFieldHandler: MissingFieldHandler? = null
5052
private var allowUnimplementedResolvers = false
5153
private var objectMapperProvider: PerFieldObjectMapperProvider = PerFieldConfiguringObjectMapperProvider()
5254
private val proxyHandlers: MutableList<ProxyHandler> = mutableListOf(Spring4AopProxyHandler(), GuiceAopProxyHandler(), JavassistProxyHandler(), WeldProxyHandler())
@@ -77,6 +79,10 @@ data class SchemaParserOptions internal constructor(
7779
this.useDefaultGenericWrappers = useDefaultGenericWrappers
7880
}
7981

82+
fun missingFieldHandler(missingFieldHandler: MissingFieldHandler?) = this.apply {
83+
this.missingFieldHandler = missingFieldHandler
84+
}
85+
8086
fun allowUnimplementedResolvers(allowUnimplementedResolvers: Boolean) = this.apply {
8187
this.allowUnimplementedResolvers = allowUnimplementedResolvers
8288
}
@@ -154,6 +160,7 @@ data class SchemaParserOptions internal constructor(
154160
return SchemaParserOptions(
155161
contextClass,
156162
wrappers,
163+
missingFieldHandler,
157164
allowUnimplementedResolvers,
158165
objectMapperProvider,
159166
proxyHandlers,

src/main/kotlin/graphql/kickstart/tools/resolver/FieldResolverScanner.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
6464
}
6565

6666
private fun missingFieldResolver(field: FieldDefinition, searches: List<Search>, scanProperties: Boolean): FieldResolver {
67-
return if (options.allowUnimplementedResolvers) {
68-
log.warn("Missing resolver for field: $field")
67+
return if (options.allowUnimplementedResolvers || options.missingFieldHandler != null) {
68+
if (options.allowUnimplementedResolvers) {
69+
log.warn("Missing resolver for field: $field")
70+
}
6971

7072
MissingFieldResolver(field, options)
7173
} else {
Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
package graphql.kickstart.tools.resolver
22

3+
import graphql.kickstart.tools.*
34
import graphql.kickstart.tools.MissingResolverInfo
4-
import graphql.kickstart.tools.SchemaParserOptions
55
import graphql.kickstart.tools.TypeClassMatcher
66
import graphql.language.FieldDefinition
77
import graphql.schema.DataFetcher
8+
import graphql.schema.DataFetchingEnvironment
89

910
internal class MissingFieldResolver(
10-
field: FieldDefinition,
11-
options: SchemaParserOptions
11+
field: FieldDefinition,
12+
options: SchemaParserOptions
1213
) : FieldResolver(field, FieldResolverScanner.Search(Any::class.java, MissingResolverInfo(), null), options, Any::class.java) {
1314

1415
override fun scanForMatches(): List<TypeClassMatcher.PotentialMatch> = listOf()
16+
override fun createDataFetcher(): DataFetcher<*> {
17+
val handler = options.missingFieldHandler ?: return NotImplementedMissingFieldDataFetcher()
18+
return MissingFieldDataFetcher(handler)
19+
}
1520

16-
override fun createDataFetcher(): DataFetcher<*> = DataFetcher<Any> { TODO("Schema resolver not implemented") }
21+
class MissingFieldDataFetcher(private val handler: MissingFieldHandler): DataFetcher<Any?> {
22+
override fun get(p0: DataFetchingEnvironment?): Any? {
23+
return handler.resolve(p0)
24+
}
25+
}
26+
27+
class NotImplementedMissingFieldDataFetcher: DataFetcher<Any?> {
28+
override fun get(p0: DataFetchingEnvironment?): Any? {
29+
TODO("Schema resolver not implemented")
30+
}
31+
}
1732
}

0 commit comments

Comments
 (0)