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