是否可以有选择地确定在运行时何时使用@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注释中定义的“ apiFilter”过滤器时,它会找到它,但不会产生任何效果(因为将序列化所有属性)。

编辑
另外,您可以调用工厂方法writer()而不是filteredWriter()

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);


我认为最后一种解决方案更清洁,甚至更好。

关于json - @JsonFilter引发“JsonMappingException:无法解析BeanPropertyFilter”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9382094/

10-12 06:24