gpt4 book ai didi

java - 如何在 Spring Controller 中包含使用 JsonFilter 过滤的属性?

转载 作者:行者123 更新时间:2023-11-30 07:15:36 28 4
gpt4 key购买 nike

我需要仅在一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com