0

現在、 と を組み合わせる@JsonIdentityInfoと、Jackson に問題が発生してい@JsonTypeInfoます。以下の Kotlin コードは、最後の行で例外をスローします。dog1AndDog1Json期待どおりにインスタンスをJsonにシリアル化しますが、インスタンスに逆シリアル化するときに例外をスローします。

package some.test

import com.fasterxml.jackson.annotation.*
import com.fasterxml.jackson.databind.ObjectMapper

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
@JsonSubTypes(JsonSubTypes.Type(value = Dog::class), JsonSubTypes.Type(value = Cat::class))
interface Animal {
    val name: String
}

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator::class)
data class Dog(@JsonProperty("name") override val name: String) : Animal

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator::class)
data class Cat(@JsonProperty("name") override val name: String) : Animal

data class TwoAnimals(@JsonProperty("animal1") val animal1: Animal, @JsonProperty("animal2") val animal2: Animal)

fun main() {
    val om = ObjectMapper();

    val dog1 = Dog("Dog1")
    val dog2 = Dog("Dog2")
    val cat1 = Cat("Cat1")

    val dog1AndDog2 = TwoAnimals(dog1, dog2)
    val dog1AndDog2Json = om.writerWithDefaultPrettyPrinter().writeValueAsString(dog1AndDog2)
    assert(dog1AndDog2 === om.readValue(dog1AndDog2Json, TwoAnimals::class.java)) // OK

    val dog1AndCat1 = TwoAnimals(dog1, cat1)
    val dog1AndCat2Json = om.writerWithDefaultPrettyPrinter().writeValueAsString(dog1AndCat1)
    assert(dog1AndCat1 === om.readValue(dog1AndCat2Json, TwoAnimals::class.java)) // OK

    val dog1AndDog1 = TwoAnimals(dog1, dog1)
    val dog1AndDog1Json = om.writerWithDefaultPrettyPrinter().writeValueAsString(dog1AndDog1)
    println(dog1AndDog1Json)
    assert(dog1AndDog1 === om.readValue(dog1AndDog1Json, TwoAnimals::class.java)) // DESERIALIZE FAILS
}

次に、次の出力を取得するメイン関数を実行します。

{
  "animal1" : {
    "@class" : "some.test.Dog",
    "@id" : 1,
    "name" : "Dog1"
  },
  "animal2" : 1
}

この例外が続きます:

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class some.test.Animal]: missing type id property '@class' (for POJO property 'animal2')
 at [Source: (String)"{
  "animal1" : {
    "@class" : "some.test.Dog",
    "@id" : 1,
    "name" : "Dog1"
  },
  "animal2" : 1
}"; line: 7, column: 15] (through reference chain: some.test.TwoAnimals["animal2"])
    at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43)
<truncated rest of stacktrace>

ジャクソンはanimal2、 @class プロパティを持つプロパティのオブジェクトが、デシリアライズされる正しいクラスタイプを見つけることを期待しているようです。@JsonIdentityInfoただし、注釈によって id に置き換えられています。Jackson がその ID でオブジェクトを検索せず、そのインスタンスの @class プロパティをチェックしないのはなぜですか?

このユースケースがジャクソンによってサポートされていないのか、それとも私が何か間違ったことをしているのか (私が望んでいること) はわかりません。それともバグですか?

4

1 に答える 1

0

私はそれをうまく機能させることができました:

  1. およびサブクラス@JsonIdentityInfoからの注釈の削除DogCar
  2. 基本クラスに a@JsonIdentityInfoを追加するAnimal
于 2019-12-10T08:20:59.737 に答える