Skip to content

Commit b4b2627

Browse files
authored
Merge pull request #229 from jhaber/master
Better detection of map type parameters
2 parents 3b5d9d0 + 02e1d07 commit b4b2627

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@
5050
<artifactId>graphql-java</artifactId>
5151
<version>11.0</version>
5252
</dependency>
53+
<dependency>
54+
<groupId>com.fasterxml</groupId>
55+
<artifactId>classmate</artifactId>
56+
<version>1.4.0</version>
57+
</dependency>
5358
<dependency>
5459
<groupId>com.fasterxml.jackson.core</groupId>
5560
<artifactId>jackson-core</artifactId>

src/main/kotlin/com/coxautodev/graphql/tools/GenericType.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.coxautodev.graphql.tools
22

3+
import com.fasterxml.classmate.ResolvedType
34
import com.google.common.primitives.Primitives
45
import org.apache.commons.lang3.reflect.TypeUtils
56
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
@@ -131,6 +132,14 @@ internal open class GenericType(protected val mostSpecificType: JavaType, protec
131132
val actualTypeArguments = type.actualTypeArguments.map { replaceTypeVariable(it) }.toTypedArray()
132133
ParameterizedTypeImpl.make(type.rawType as Class<*>?, actualTypeArguments, type.ownerType)
133134
}
135+
is ResolvedType -> {
136+
if (type.typeParameters.isEmpty()) {
137+
type.erasedType
138+
} else {
139+
val actualTypeArguments = type.typeParameters.map { replaceTypeVariable(it) }.toTypedArray()
140+
ParameterizedTypeImpl.make(type.erasedType, actualTypeArguments, null)
141+
}
142+
}
134143
is TypeVariable<*> -> {
135144
if (declaringType is ParameterizedType) {
136145
TypeUtils.getRawType(type, declaringType)

src/main/kotlin/com/coxautodev/graphql/tools/PropertyMapResolver.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.coxautodev.graphql.tools
22

3+
import com.fasterxml.classmate.TypeResolver
34
import graphql.language.FieldDefinition
45
import graphql.schema.DataFetcher
56
import graphql.schema.DataFetchingEnvironment
6-
import java.lang.reflect.ParameterizedType
77

88
/**
99
* @author Nick Weedon
@@ -14,12 +14,17 @@ internal class PropertyMapResolver(field: FieldDefinition, search: FieldResolver
1414

1515
var mapGenericValue : JavaType = getMapGenericType(relativeTo)
1616

17+
/**
18+
* Takes a type which implements Map and tries to find the
19+
* value type of that map. For some reason, mapClass is losing
20+
* its generics somewhere along the way and is always a raw
21+
* type
22+
*/
1723
fun getMapGenericType(mapClass : JavaType) : JavaType {
18-
if(mapClass is ParameterizedType) {
19-
return mapClass.actualTypeArguments[1]
20-
} else {
21-
return Object::class.java
22-
}
24+
val resolvedType = TypeResolver().resolve(mapClass)
25+
26+
val typeParameters = resolvedType.typeParametersFor(Map::class.java)
27+
return typeParameters.elementAtOrElse(1) { Object::class.java }
2328
}
2429

2530
override fun createDataFetcher(): DataFetcher<*> {

0 commit comments

Comments
 (0)