0

友達、

特定のシナリオで@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 を使用する場合にのみ、型情報を含めるべきではなく、デシリアライゼーション中に期待すべきではありません。

4

1 に答える 1

1

これはサポートされているユースケースではないと思います。@JsonTypeInfoベースタイプで使用するか、プロパティで使用する必要があります(注釈のないタイプの場合)。アプローチを混在させようとしないでください。型に型情報を含める必要があるかどうかのどちらかです。ある方法でそれを実行しようとすると、場合によっては別の方法で実行しようとすると、危険なマイクロ最適化のように聞こえます。

于 2012-09-05T20:58:58.067 に答える