Skip to content

Commit 305d630

Browse files
author
Jonathan Haber
committed
Use ClassMate to find map type arguments
1 parent 5bbc37e commit 305d630

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
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/PropertyMapResolver.kt

Lines changed: 16 additions & 3 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,10 +14,23 @@ internal class PropertyMapResolver(field: FieldDefinition, search: FieldResolver
1414

1515
var mapGenericValue : JavaType = getMapGenericType(relativeTo)
1616

17+
/**
18+
* this impl still has some problems:
19+
* - mapClass lost its generics somewhere along the way, so if you had
20+
* something like {@code class Resolver<V> implements Map<String, V>}
21+
* then we won't be able to infer the value type
22+
* - this doesn't handle the case of the map value type being generic,
23+
* for example {@code class Resolver implements Map<String, MyType<MyTypeArg>>}
24+
*/
1725
fun getMapGenericType(mapClass : JavaType) : JavaType {
18-
if(mapClass is ParameterizedType) {
19-
return mapClass.actualTypeArguments[1]
26+
val resolvedType = TypeResolver().resolve(mapClass)
27+
28+
val mapValueType = resolvedType.typeParametersFor(Map::class.java)[1]
29+
if (mapValueType.typeParameters.isEmpty()) {
30+
// no type params should mean regular class
31+
return mapValueType.erasedType
2032
} else {
33+
// TODO raise an error? try to handle this case?
2134
return Object::class.java
2235
}
2336
}

0 commit comments

Comments
 (0)