我有第三方类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中获得注释,我将其配置为只处理名称和日期?请随意指出我可能忽略的基本内容。提前谢谢!
答案 0 :(得分:0)
这是配置问题。 mixin仅在序列化配置上设置,而不是在反序列化配置上设置导致问题。在两个配置上设置它可以解决问题。