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 class ,所以默认情况下它会将类型信息添加到它的所有子类中以支持多态性。

列表可以有所有类型,例如动物、狗、猫。我的要求是我不希望 List 中 Animal 实例本身的类型信息以及 zoo2i 类中 Dog 类型的其他属性的类型信息。

我成功地覆盖了 setDog(....) 的注释,但 setAnimals(...) 失败了(请参阅 Zoo2i 类)。

是否有任何不同的方法来排除带注释的类本身的类型信息或在反序列化期间使类型信息可选(非强制性)。

还有一件事,默认情况下,使用 Animal 及其所有实例,类型信息包含在 Animal 被注释的情况下,我希望只有当我直接使用 Cat 时, Dog 然后类型信息不应该包含在内,并且在反序列化期间不应该出现;

4

1 回答 1

1

我不认为这是一个受支持的用例:您应该在要使用@JsonTypeInfo的基本类型上使用,或者在属性上使用(对于未注释的类型)。不要尝试混合方法。一个类型是否应该包含类型信息——在某些情况下尝试以一种方式来做,而在其他情况下,另一种方式听起来像是一种危险的微优化。

于 2012-09-05T20:58:58.067 回答