作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要仅在一个 Controller 中过滤某些属性。
当我在 Controller 中将 Fasterxml JsonFilter 与 ObjectMapper 一起使用时,它可以正常工作,如下所示
FilterProvider filter2 = new SimpleFilterProvider().addFilter("somefilter",
SimpleBeanPropertyFilter.filterOutAllExcept("prop1","prop2"));
使用类似的对象
@JsonFilter("somefilter")
public class Bar{
String prop1;
String prop2;
String prop3;
}
但是当尝试使用 spring Controller 返回相同的对象时
@RequestMapping(value = "/path", method = RequestMethod.GET)
protected @ResponseBody Foo handleGet( ..
哪里
public class Foo{
Bar p1;
Bar p2;
}
Bar 属性被完全省略。在这种情况下,我们需要返回未过滤的对象。
我必须使用 Controller 中的对象映射器来返回整个对象。
有没有办法禁用 Controller 的过滤器?
最佳答案
您可以尝试 MappingJacksonValue
设置 Jackson 过滤器提供程序以在 Spring Controller 中序列化 POJO。
来自AbstractJackson2HttpMessageConverter的源代码:
protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
...
try {
...
if (object instanceof MappingJacksonValue) {
MappingJacksonValue container = (MappingJacksonValue) object;
...
filters = container.getFilters();
}
...
ObjectWriter objectWriter;
if (serializationView != null) {
objectWriter = this.objectMapper.writerWithView(serializationView);
}
else if (filters != null) {
objectWriter = this.objectMapper.writer(filters);
}
else {
objectWriter = this.objectMapper.writer();
}
...
objectWriter.writeValue(generator, value);
...
}
应该可以通过 MappingJacksonValue
中设置的过滤器重置 objectMapper
中的 FilterProvider
。对于您的情况,您可以尝试如下操作:
@RequestMapping(value = "/foo", method = RequestMethod.GET)
protected @ResponseBody MappingJacksonValue handleGet(...) {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(foo);
FilterProvider filter = new SimpleFilterProvider().addFilter("somefilter", SimpleBeanPropertyFilter.serializeAllExcept());
mappingJacksonValue.setFilters(filter);
return mappingJacksonValue;
}
如果您只有一个 Controller 需要从 Bar
中过滤掉属性,您也可以考虑为特定 Controller 添加过滤器,而不是将其设置到 ObjectMapper 中:
@RequestMapping(value = "/bar", method = RequestMethod.GET)
protected @ResponseBody MappingJacksonValue handleGet(...) {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(bar);
FilterProvider filter = new SimpleFilterProvider().addFilter("somefilter", SimpleBeanPropertyFilter.filterOutAllExcept("prop1","prop2"));
mappingJacksonValue.setFilters(filter);
return mappingJacksonValue;
}
关于java - 如何在 Spring Controller 中包含使用 JsonFilter 过滤的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461938/
我是一名优秀的程序员,十分优秀!