问题描述
我在杰克逊反序列化的对象中有这个定义:
public class ImportantInterfaceObject {
@JsonAnySetter
private Map<String,String> unmapped = new HashMap<String,String>();
// ... other stuff omitted for clarity ...
}
这非常有用,它允许unmapped
成员捕获要根据要求和最佳实践进行处理的输入中的任何意外值。
但是,这会给这个额外的包poll污染ImportantInterfaceObject
定义。
是否有一种方法可以达到与@JsonAnySetter
相同的效果,但是在Jackson对象生命周期的另一个层次上呢?
例如,
ObjectMapper objectMapper = new ObjectMapper();
// pseudo-code,this doesn't exist
objectMapper.setAnyHandler((key,value) -> doSomething(...));
// back to normal valid code Now
JsonNode json = objectMapper.readTree(input);
解决方法
如果您只想忽略未映射的属性,则可以执行以下操作:
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
但是我想您想对未知属性启用一些处理,但同时又将其隐藏在类的实际逻辑中。
在这种情况下,您可以只使用继承,而不必使用Map
创建使用@JsonAnySetter
批注的方法,例如:
public class UnmappedPropertyHandler {
@JsonAnySetter
private void handleUnmapped(String name,String value) {
// do what you need
}
}
和
public class ImportantInterfaceObject extends UnmappedPropertyHandler {
// ... any actually mapped stuff
}
您还可以声明接口,但是如果使用Java8,则无法隐藏该方法:
interface IUnmappedPropertyHandler {
@JsonAnySetter
default void handleUnmapped(String name,String value) {
}
}
对于Java11,可能是这样的,
interface IUnmappedPropertyHandler {
@JsonAnySetter
private void handleUnmapped(String name,String value) {
}
}