是否可以有选择地确定@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);
我认为这最后一个解决方案是更清洁,而且更好.