当作为参数传递时,Mixin注释不会得到尊重

时间:2013-05-06 05:16:00

标签: cxf jackson jax-rs

我有第三方类SpecialObject:

public class SpecialObject {
    private String name;
    private Integer id;
    private Date date;
    public String getFoo() {return "foo";} //Outlier
    public String getName() { return name;}
    public Integer getId() {return id;}
    public Date getDate() {return date;}
    public void setName(String name) {this.name = name;}
    public void setId(Integer id) {this.id = id;}
    public void setDate(Date date) {this.date = date;}
}

我希望在序列化时只展示名称和日期属性。利用Jackson的MixinAnnotation的魔力,我创建了一个Mixin界面:

@JsonAutoDetect(getterVisibility = Visibility.NONE)
public interface SpecialObjectMixin {
    @JsonProperty
    public String getName();
    @JsonProperty
    public Date getDate();
}

为了便于将此SpecialObject作为参数处理,我还定义了一个实现fromString()方法的SpecialObjectHandler。

@Override
public SpecialObject fromString(String json) {
    try {
        return objectMapper.readValue(json, SpecialObject.class);
    } catch (IOException exception) {
        throw new IllegalArgumentException("Unable to write JSON output",
                exception);
    }
}

当反序列化器调用此方法时,objectMapper会抛出错误

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "foo" (Class com.kilo.SpecialObject), not marked as ignorable
 at [Source: java.io.StringReader@2d2217da; line: 1, column: 60] (through reference chain: com.kilo.SpecialObject["foo"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
at com.kilo.SpecialObjectHandler.fromString(SpecialObjectHandler.java:34)

我的问题是,有没有一种方法可以让objectMapper(org.codehaus.jackson.map.ObjectMapper)也从Mixin中获得注释,我将其配置为只处理名称和日期?请随意指出我可能忽略的基本内容。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这是配置问题。 mixin仅在序列化配置上设置,而不是在反序列化配置上设置导致问题。在两个配置上设置它可以解决问题。

相关问题