@JsonFilter抛出“JsonMappingException:无法解析BeanPropertyFilter”

前端之家收集整理的这篇文章主要介绍了@JsonFilter抛出“JsonMappingException:无法解析BeanPropertyFilter”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以有选择地确定@JsonFilter注释何时在运行时被使用?

当我不提供过滤器时,我会收到JsonMappingException异常(见下文).

背景:

我从recent StackOverflow post学到了,我可以使用@JsonFilter动态过滤bean序列化的属性.这很好.在我的域类中添加了@JsonFilter(“apiFilter”),并在我的jax-rs服务中添加了这个代码(使用CXF实现),我可以动态地过滤RESTful API返回的属性

// shortened for brevity
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter",SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

return mapper.filteredWriter(filters).writeValueAsString(user);

问题是有不同的服务调用,我根本不想应用过滤器.在这些情况下,我想返回整个域类而不过滤任何属性.在我刚刚尝试返回域类的情况下,我会得到如下异常:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured

at org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)
at org.codehaus.jackson.map.ser.BeanSerializer.serializeFieldsFiltered(BeanSerializer.java:216)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:140)

解决方法

我想你可能会欺骗过滤器的作者定义一个空的序列化过滤器,在这种情况下,您希望所有的属性都被分段:
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter",SimpleBeanPropertyFilter.serializeAllExcept(emptySet));

这样,当引擎查找@JsonFilter anotation中定义的“apiFilter”过滤器时,它会发现它,但它不会有任何作用(将序列化所有属性).

编辑
此外,您可以调用factory method()而不是filtersWriter():

ObjectWriter writer=null;
if(aplyFilter) {
    FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter",SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
    writer=mapper.filteredWriter(filters);
} else {
   writer=mapper.writer();
}

return writer.writeValueAsString(user);

我认为这最后一个解决方案是更清洁,而且更好.

猜你在找的JavaScript相关文章