我有一个属于我无法访问的第三方库的课程。它看起来像:
public class Product {
private String thumbnailUrl;
// many other properties, some of which are POJOs or collections
public String getThumbnailUrl() {
return thumbnailUrl;
}
public void setThumbnailUrl(String thumbnailUrl) {
this.thumbnailUrl = thumbnailUrl;
}
}
这只是我要使用Jackson序列化为字符串的类之一。还有很多其他人。
thumbnailUrl
属性有时可以是null
。如何ObjectMapper
配置http://www.example.com/unknown.png
以将此字段序列化为null
,如果它是null
?
我认为我无法使用mixins因为mixins无法访问原始对象,因此他们无法检查属性的值是否为enum
。< / p>
答案 0 :(得分:0)
这应该可以解决问题:
private String thumbnailUrl = "http://my.default.url";
正如评论中提到的OP,该课程来自第三方库,因此修改它(a&#39; la this SO)或注释(a&#39; la this SO)不是一种选择。在这种情况下,您还有两个选项:
修补第三方库(显然您可以访问源代码;))
在自定义序列化程序中解决它(需要进行适当的测试,这种快速黑客在多线程环境中不起作用)
如:
@Override
public void serialize(Product value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
boolean revert = false;
if (value.thumbnailUrl == null) {
value.thumbnailUrl = "http://my.default.url";
revert = true;
}
jgen.writeObject(value);
if (revert) {
value.thumbnailUrl = null;
}
}
答案 1 :(得分:0)
我最终得到了这个解决方案,但并不像我期望的那样简单:
@Test
public void shouldSerializeDefaultThumbnailUrlIfThumbnailUrlIsNull() throws Exception {
// Given
Product p = new Product();
p.setPrimaryKey("123");
PropertyFilter filter = new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer) throws Exception {
if (pojo.getClass().equals(Product.class)
&& ((Product) pojo).getThumbnailUrl() == null
&& writer.getName().equals("thumbnailUrl")) {
jgen.writeStringField(writer.getName(), "http://www.example.com/default.png");
} else {
writer.serializeAsField(pojo, jgen, prov);
}
}
};
FilterProvider filters = new SimpleFilterProvider().addFilter("thumbnailFilter", filter);
this.mapper.setFilterProvider(filters);
String json = this.mapper.writeValueAsString(p);
assertThat(json, equalTo("{\"thumbnailUrl\":\"http://www.example.com/default.png\",\"id\":\"123\"}"));
}
忽略这一点。它在我的情况下不起作用,因为我的课程需要注释,我不能。