Dariusz Kuc
03/16/2020, 7:44 PM@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "__typename")
@JsonSubTypes(value = [
Type(value = Car::class, name = "Car"),
Type(value = Plane::class, name = "Plane")])
interface Vehicle {
Dariusz Kuc
03/16/2020, 7:44 PMJsonSubTypes
values, e.g.
interfaceTypeSpec.addAnnotation(AnnotationSpec.Companion.builder(JsonTypeInfo::class.java)
.addMember("use = %T", JsonTypeInfo.Id.NAME::class.java)
.addMember("include = %T", JsonTypeInfo.As.PROPERTY::class.java)
.addMember("property = %S", "__typename")
.build())
// implementations is a list of ClassName
val jsonSubTypes = implementations.map { implementationType ->
AnnotationSpec.builder(JsonSubTypes.Type::class.java)
.addMember("value = %T::class", implementationType)
.addMember("name = %S", implementationType.simpleName)
.build()
}
interfaceTypeSpec.addAnnotation(AnnotationSpec.Companion.builder(JsonSubTypes::class.java)
.addMember("value = %L", jsonSubTypes)
.build())
Dariusz Kuc
03/16/2020, 7:46 PM@JsonTypeInfo(
use = JsonTypeInfo.Id,
include = <http://JsonTypeInfo.As|JsonTypeInfo.As>,
property = "__typename"
)
@JsonSubTypes(value = [@com.fasterxml.jackson.annotation.JsonSubTypes.Type(value =
path.to.Car::class,
name = "Car"),
@com.fasterxml.jackson.annotation.JsonSubTypes.Type(value =
path.to.Plane::class,
name = "Plane")])
interface Vehicle
Dariusz Kuc
03/16/2020, 7:46 PMDariusz Kuc
03/16/2020, 7:47 PMDariusz Kuc
03/17/2020, 4:58 AMval jsonSubTypesCodeBlock = CodeBlock.builder()
implementations.forEach { implClassName ->
if (jsonSubTypesCodeBlock.isNotEmpty()) {
jsonSubTypesCodeBlock.add(",")
}
jsonSubTypesCodeBlock.add("com.fasterxml.jackson.annotation.JsonSubTypes.Type(value = %T::class, name=%S)", implClassName, implClassName.name)
}
Dariusz Kuc
03/17/2020, 4:58 AMegorand
03/18/2020, 5:47 PM%L
should work for `AnnotationSpec`sDariusz Kuc
03/18/2020, 6:23 PMegorand
03/18/2020, 11:37 PM