友達、
特定のシナリオで@JsonTypeInfoアノテーションをオーバーライドする際に問題に直面しています。
以下のように私のクラス構造を見つけてください。
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY,
property = "@type")
class Animal {
public String name = "animalName";
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
}
class Cat extends Animal {
boolean likesCream = true;
public int lives = 10;
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Cat [likesCream=" + likesCream + ", lives=" + lives + ", name="
+ name + "]";
}
/**
* @return the likesCream
*/
public boolean isLikesCream() {
return likesCream;
}
/**
* @param likesCream
* the likesCream to set
*/
public void setLikesCream(boolean likesCream) {
this.likesCream = likesCream;
}
/**
* @return the lives
*/
public int getLives() {
return lives;
}
/**
* @param lives
* the lives to set
*/
public void setLives(int lives) {
this.lives = lives;
}
}
class Dog extends Animal {
public double barkVolume; // in decibels
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Dog [barkVolume=" + barkVolume + ", name=" + name + "]";
}
/**
* @return the barkVolume
*/
public double getBarkVolume() {
return barkVolume;
}
/**
* @param barkVolume
* the barkVolume to set
*/
public void setBarkVolume(double barkVolume) {
this.barkVolume = barkVolume;
}
}
今、シリアル化/逆シリアル化する必要があるZooクラスで上記のクラスを使用しています。
class Zoo2i {
List<Animal> animals;
Dog dog;
/**
* @return the animals
*/
public List<Animal> getAnimals() {
return animals;
}
/**
* @param animals
* the animals to set
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.PROPERTY,
property = "@type")
public void setAnimals(List<Animal> animals) {
this.animals = animals;
}
/**
* @return the dog
*/
public Dog getDog() {
return dog;
}
/**
* @param dog
* the dog to set
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.PROPERTY,
property = "@type")
public void setDog(Dog dog) {
this.dog = dog;
}
}
Animal クラスに注釈を付けたので、ポリモーフィズムをサポートするために、デフォルトですべてのサブクラスに型情報が追加されます。
リストには、Animal、Dog、Cat などのすべてのタイプを含めることができます。私の要件は、List 内の Animal インスタンス自体の型情報と、zoo2i クラス内の型 Dog の他のプロパティの型情報が必要ないことです。
setDog(....) のアノテーションのオーバーライドに成功しましたが、setAnimals(...) のオーバーライドに失敗しました (Zoo2i クラスを参照してください)。
注釈付きクラス自体の型情報を除外する方法、または逆シリアル化中に型情報をオプション (必須ではない) にする別の方法はありますか。
もう 1 つ、デフォルトでは Animal とそのすべてのインスタンスが使用され、型情報は Animal に注釈が付けられているため含まれています。直接 Cat 、 Dog を使用する場合にのみ、型情報を含めるべきではなく、デシリアライゼーション中に期待すべきではありません。