@@ -15,7 +15,6 @@ import graphql.language.*
1515import graphql.schema.DataFetcher
1616import graphql.schema.DataFetchingEnvironment
1717import graphql.schema.GraphQLFieldDefinition
18- import graphql.schema.GraphQLTypeUtil.isScalar
1918import graphql.schema.LightDataFetcher
2019import kotlinx.coroutines.CoroutineStart
2120import kotlinx.coroutines.ensureActive
@@ -40,7 +39,8 @@ internal class MethodFieldResolver(
4039 field : FieldDefinition ,
4140 search : FieldResolverScanner .Search ,
4241 options : SchemaParserOptions ,
43- val method : Method
42+ val method : Method ,
43+ private val scalarNames : Set <String >
4444) : FieldResolver(field, search, options) {
4545
4646 private val log = LoggerFactory .getLogger(javaClass)
@@ -78,6 +78,8 @@ internal class MethodFieldResolver(
7878 val isNonNull = definition.type is NonNullType
7979 val isOptional = this .typeResolver.getRawClass(parameterType) == Optional ::class .java
8080 val argumentConverter = ArgumentConverter (mapper, parameterType)
81+ val parameterClass = parameterType.unwrap()
82+ val isConcreteScalar = isConcreteScalarType(definition.type, parameterType)
8183
8284 args.add { environment ->
8385 val argumentPresent = environment.arguments.containsKey(definition.name)
@@ -94,7 +96,7 @@ internal class MethodFieldResolver(
9496 return @add Optional .empty<Any >()
9597 }
9698
97- if (value == null || shouldValueBeConverted(value, definition, parameterType, environment )) {
99+ if (value == null || ! isConcreteScalar || ! parameterClass.isInstance(value )) {
98100 return @add argumentConverter.convert(value)
99101 }
100102
@@ -141,24 +143,18 @@ internal class MethodFieldResolver(
141143 }
142144 }
143145
144- private fun shouldValueBeConverted (value : Any , definition : InputValueDefinition , parameterType : JavaType , environment : DataFetchingEnvironment ): Boolean {
145- return ! parameterType.unwrap().isAssignableFrom(value.javaClass) || ! isConcreteScalarType(environment, definition.type, parameterType)
146- }
147-
148146 /* *
149147 * A concrete scalar type is a scalar type where values always coerce to the same Java type. The ID scalar type is not concrete
150148 * because values can be coerced to multiple different Java types (eg. String, Long, UUID). All values of a non-concrete scalar
151149 * type must be converted to the target method parameter type.
152150 */
153- private fun isConcreteScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean {
151+ private fun isConcreteScalarType (type : Type <* >, genericParameterType : JavaType ): Boolean {
154152 return when (type) {
155- is ListType -> List ::class .java.isAssignableFrom(this .typeResolver.getRawClass(genericParameterType))
156- && isConcreteScalarType(environment, type.type, this .typeResolver.resolve(genericParameterType))
157-
158- is TypeName -> environment.graphQLSchema.getType(type.name!! )?.let { isScalar(it) && type.name != " ID" }
159- ? : false
153+ is ListType -> genericParameterType.typeArgument(List ::class .java)
154+ ?.let { isConcreteScalarType(type.type, it) } ? : false
160155
161- is NonNullType -> isConcreteScalarType(environment, type.type, genericParameterType)
156+ is TypeName -> type.name in scalarNames && type.name != " ID"
157+ is NonNullType -> isConcreteScalarType(type.type, genericParameterType)
162158 else -> false
163159 }
164160 }
0 commit comments