Skip to content

Commit d7646cd

Browse files
Use concrete types for JsonSubType annotations on interfaces if available. (#683)
1 parent 47e98f3 commit d7646cd

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/InterfaceGenerator.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
8989
val implementations = document.getDefinitionsOfType(ObjectTypeDefinition::class.java).asSequence()
9090
.filter { node -> node.implements.any { it.isEqualTo(TypeName(definition.name)) } }
9191
.map { node ->
92-
val nodeName = if (config.generateInterfaces) "I${node.name}" else node.name
93-
typeUtils.findJavaInterfaceName(nodeName, packageName)
92+
typeUtils.findJavaInterfaceName(node.name, packageName)
9493
}
9594
.filterIsInstance<ClassName>()
9695
.toList()
9796

98-
if (implementations.isNotEmpty()) {
97+
// Add JsonSubType annotations only if there are no generated concrete types that implement the interface
98+
if (implementations.isNotEmpty() && config.generateDataTypes) {
9999
javaType.addAnnotation(jsonTypeInfoAnnotation())
100100
javaType.addAnnotation(jsonSubTypeAnnotation(implementations))
101101
}

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/CodeGenTest.kt

+36
Original file line numberDiff line numberDiff line change
@@ -2752,6 +2752,42 @@ class CodeGenTest {
27522752
assertCompilesJava(dataTypes + interfaces)
27532753
}
27542754

2755+
@Test
2756+
fun generatedInterfacesShouldShouldHaveCorrectJsonTypeAnnotations() {
2757+
val schema = """
2758+
interface Fruit {
2759+
seeds: [Seed]
2760+
}
2761+
2762+
type Apple implements Fruit {
2763+
seeds: [Seed]
2764+
truth: Boolean!
2765+
}
2766+
2767+
type Seed {
2768+
shape: String
2769+
}
2770+
""".trimIndent()
2771+
2772+
val result = CodeGen(
2773+
CodeGenConfig(
2774+
schemas = setOf(schema),
2775+
packageName = basePackageName,
2776+
generateInterfaces = true,
2777+
generateIsGetterForPrimitiveBooleanFields = true
2778+
)
2779+
).generate()
2780+
2781+
val interfaces = result.javaInterfaces
2782+
val dataTypes = result.javaDataTypes
2783+
2784+
val iFruit = interfaces[2]
2785+
assertThat(iFruit.typeSpec.annotations.size).isEqualTo(2)
2786+
assertThat(iFruit.typeSpec.annotations[0].toString()).isEqualTo("@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY, property = \"__typename\")")
2787+
assertThat(iFruit.typeSpec.annotations[1].toString()).isEqualTo("@com.fasterxml.jackson.annotation.JsonSubTypes(@com.fasterxml.jackson.annotation.JsonSubTypes.Type(value = com.netflix.graphql.dgs.codegen.tests.generated.types.Apple.class, name = \"Apple\"))")
2788+
assertCompilesJava(dataTypes + interfaces)
2789+
}
2790+
27552791
@Test
27562792
fun generateObjectTypeInterfaceWithPrimitiveBooleanShouldUseIsGetter() {
27572793
val schema = """

0 commit comments

Comments
 (0)