我有需要向REST Api发送/检索的多态类层次结构。
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include =
JsonTypeInfo.As.PROPERTY, property = "@class")
public class Property implements IProperty, Serializable {
private static final long serialVersionUID = 1L;
private String name;
例如,其中一个是孩子:
public class PropertyEnum extends Property {
private static final long serialVersionUID = 1L;
private String value;
private Collection<String> values = new LinkedList<String>();
当发送Property []数组以保留资源或将其取回时,我的PropertyEnum中的value字段为空且未填充! 另一方面,将填充值字段。 名称是肯定填充的,因为它在父类上。
我也尝试过:
//@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include =JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY,
property = "name")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = PropertyEnum.class, name = "enum")
})
@JsonTypeName("enum")
public class PropertyEnum extends Property {
(尽管添加新类型时始终需要维护代码!)
再尝试一次:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,
property="objectType")
@JsonSubTypes({
@JsonSubTypes.Type(value=PropertyEnum.class)
})
public class Property implements IProperty, Serializable {
private static final long serialVersionUID = 1L;
private String name;
protected Property(){}
...
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,
property="objectType")
public class PropertyEnum extends Property {
private static final long serialVersionUID = 1L;
private String value;
private Collection<String> values = new LinkedList<String>();
protected PropertyEnum(){}
但是我有一个奇怪的行为...一个填充了子字段(值),另一个填充了(值)? 我两个都有设置器/获取器!
有什么主意吗?
致谢。
答案 0 :(得分:0)
我仍然不知道为什么不填充一个字段而另一些填充字段,但是我通过将注释@JsonProperty添加到有问题的字段中来解决了这个问题。
我的解决方案:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY,
property = "@class")
public class Property implements IProperty, Serializable {
private static final long serialVersionUID = 1L;
private String name;
protected Property(){}
...
public class PropertyEnum extends Property {
private static final long serialVersionUID = 1L;
@JsonProperty
private String value;
private Collection<String> values = new LinkedList<String>();
protected PropertyEnum(){}