在使用@JsonFilter时,带有Jackson的Spring RestTemplate抛出“无法解析BeanPropertyFilter”

wbrvyc0a  于 2022-11-08  发布在  Spring
关注(0)|答案(2)|浏览(149)

我可以指定Spring的RestTemplate所使用的JacksonObjectMapper吗?
我不是100%,这是我需要做的,但见下文的细节。

**背景:**在this StackOverflow post的帮助下,我将@JsonFilter添加到了我的域类中,并编辑了我的jax-rs web服务(在CXF中实现)。现在,我能够成功地在RESTful API中动态选择要返回的域类字段。到目前为止,一切都很顺利。

我在JUnit测试中使用Spring的RestTemplate来测试我的RESTful API。在我将@JasonFilter添加到我的域类之前,这一直工作得很好。现在我遇到了以下异常:
出现以下异常:I/O错误:无法解析ID为'apiFilter'的BeanPropertyFilter;未配置筛选器提供程序;嵌套的异常是一个异常:无法解析ID为“apiFilter”的BeanPropertyFilter;未配置筛选器提供程序
您可以在这里找到一个新的模板,它是一个新的框架。
为简洁起见,省略了堆栈跟踪的其余部分
异常错误:无法解析ID为“apiFilter”的BeanPropertyFilter;未配置筛选器提供程序
在代码库中查找过滤器(代码库)
我在服务器端遇到了一个类似的问题,并通过向JacksonObjectMapper提供一个FilterProvider来解决它(在this post的帮助下),如下所示:

ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

我可以在RestTemplate方面做一些类似的事情吗?任何关于如何解决这个问题的想法都是非常感谢的。
需要说明的是,在客户机RestTemplate端,我根本不想过滤域对象属性。

o0lyfsai

o0lyfsai1#

我可以指定Spring的RestTemplate使用的Jackson对象Map器吗?
通过执行以下操作,我可以强制RestTemplate使用自定义的ObjectMapper:

ObjectMapper mapper = new ObjectMapper();

// set a custom filter
Set<String> filterProperties = new HashSet<String>();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.serializeAllExcept(filterProperties));
mapper.setFilters(filters);

MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter();
messageConverter.setObjectMapper(mapper);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(messageConverter);
restTemplate.setMessageConverters(messageConverters);

This website提供了上述部分代码的示例。

t30tvxxf

t30tvxxf2#

如果你使用的是TestRestTemplate,那么你可以得到RestTemplate的类,然后修改它的MappingJackson2HttpMessageConverter来包含你的过滤器:

var jackson2HttpMessageConverter = testRestTemplate.getRestTemplate().getMessageConverters().stream()
        .filter(mc -> mc instanceof MappingJackson2HttpMessageConverter)
        .map(mc -> (MappingJackson2HttpMessageConverter) mc)
        .findFirst()
        .orElseThrow();

jackson2HttpMessageConverter.getObjectMapper().setFilterProvider(
        new SimpleFilterProvider().addFilter("MyFilterName", SimpleBeanPropertyFilter.serializeAll())
);

相关问题