@@ -80,7 +80,7 @@ internal class MethodFieldResolver(
8080 return @add Optional .empty<Any >()
8181 }
8282
83- if (isValueMustBeConvert (value, definition, parameterType, environment)) {
83+ if (value != null && shouldValueBeConverted (value, definition, parameterType, environment)) {
8484 return @add mapper.convertValue(value, object : TypeReference <Any >() {
8585 override fun getType () = parameterType
8686 })
@@ -106,26 +106,25 @@ internal class MethodFieldResolver(
106106 }
107107 }
108108
109- private fun isValueMustBeConvert (value : Any? , definition : InputValueDefinition , parameterType : JavaType , environment : DataFetchingEnvironment ): Boolean {
110- return value != null
111- && (! parameterType.unwrap().isAssignableFrom(value.javaClass)
112- || ! isConcreteScalarType(environment, definition.type, parameterType))
109+ private fun shouldValueBeConverted (value : Any , definition : InputValueDefinition , parameterType : JavaType , environment : DataFetchingEnvironment ): Boolean {
110+ return ! parameterType.unwrap().isAssignableFrom(value.javaClass) || ! isConcreteScalarType(environment, definition.type, parameterType)
113111 }
114112
115113 /* *
116- * A concrete scalar type is a scalar type where values are always coerce to the same Java type.
117- * The ID scalar type is not concrete because values can be coerce to many Java types (eg. String, Long, UUID).
118- * All values of a non concrete scalar type must be convert to the method field type.
114+ * A concrete scalar type is a scalar type where values always coerce to the same Java type. The ID scalar type is not concrete
115+ * because values can be coerced to multiple different Java types (eg. String, Long, UUID). All values of a non-concrete scalar
116+ * type must be converted to the target method parameter type.
119117 */
120- private fun isConcreteScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
121- when (type) {
118+ private fun isConcreteScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean {
119+ return when (type) {
122120 is ListType -> List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
123- && isConcreteScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
121+ && isConcreteScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
124122 is TypeName -> environment.graphQLSchema?.getType(type.name)?.let { isScalar(it) && type.name != " ID" }
125- ? : false
123+ ? : false
126124 is NonNullType -> isConcreteScalarType(environment, type.type, genericParameterType)
127125 else -> false
128126 }
127+ }
129128
130129 override fun scanForMatches (): List <TypeClassMatcher .PotentialMatch > {
131130 val unwrappedGenericType = genericType.unwrapGenericType(try {
0 commit comments