28

Jackson の @JsonSubTypes アノテーションを使用してポリモーフィズムを管理する Java コードを変換しようとしています。

動作するJavaコードは次のとおりです。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Comment.class, name = "CommentNote"),
    @JsonSubTypes.Type(value = Photo.class, name = "PhotoNote"),
    @JsonSubTypes.Type(value = Document.class, name = "DocumentNote")
})
public abstract class Note implements Identifiable {
    [...]

同等だと思うKotlinコードは次のとおりです。

JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
JsonSubTypes(
    JsonSubTypes.Type(value = javaClass<Comment>(), name = "CommentNote"),
    JsonSubTypes.Type(value = javaClass<Photo>(), name = "PhotoNote"),
    JsonSubTypes.Type(value = javaClass<Document>(), name = "DocumentNote")
)
abstract class Note : Identifiable {
    [...]

しかし、3 つの「JsonSubTypes.Type」行のそれぞれで次のエラーが発生します。

Kotlin: An annotation parameter must be a compile-time constant
Kotlin: Annotation class cannot be instantiated

何か案が?

4

4 に答える 4

44

これは解決されたと思います。今日では、次のように記述できます。

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo

@JsonTypeInfo(
   use = JsonTypeInfo.Id.NAME,
   include = JsonTypeInfo.As.PROPERTY,
   property = "type")
   @JsonSubTypes(
       JsonSubTypes.Type(value = Comment::class, name = "CommentNote"),
       JsonSubTypes.Type(value = Photo::class, name = "PhotoNote"),
       JsonSubTypes.Type(value = Document::class, name = "DocumentNote"))
interface Note

に@クラスの表記がないことに注意してくださいJsonSubTypes.Type

于 2015-11-09T08:48:58.507 に答える
0
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type")
@JsonSubTypes(
    JsonSubTypes.Type(Car::class, name = "car"),
    JsonSubTypes.Type(Truck::class, name = "truck")
)
abstract class Vehicle(val type: String)
data class Car @JsonCreator constructor(@JsonProperty("manufacturer") val manufacturer: String) : Vehicle("car")
data class Truck @JsonCreator constructor(@JsonProperty("weight") val weight: Double) : Vehicle("truck")

@Test
public fun jacksonInheritanceKt() {
    val s = "[{\"type\": \"car\", \"manufacturer\": \"audi\"}, {\"type\": \"truck\", \"weight\": 3000.0}]"

    val mapper = ObjectMapper()
    val vehicles = mapper.readValue(s, object : TypeReference<List<Vehicle>>() {})
    println(vehicles)
}
于 2020-09-03T13:31:34.287 に答える