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

Jus*_*tin 2 spring jackson

我可以指定ObjectMapperSpring RestTemplate使用的Jackson 吗?

我不是100%这就是我需要做的,但请参阅下面的详细信息。

背景:此StackOverflow帖子的帮助下,我在域类中添加了@JsonFilter并编辑了我的jax-rs Web服务(在CXF中实现)。现在,我可以成功地动态选择要在我的RESTful API中返回的域类字段。到目前为止,一切都很好。

我在JUnit测试中使用Spring的RestTemplate来测试RESTful API。在我将@JasonFilter添加到我的域类之前,它一直运行良好。现在,我得到以下异常:

org.springframework.web.client.ResourceAccessException:I / O错误:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider;嵌套的异常是org.codehaus.jackson.map.JsonMappingException:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider

在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)

为简洁起见,其余的堆栈跟踪被省略

引起原因:org.codehaus.jackson.map.JsonMappingException:无法解析ID为'apiFilter'的BeanPropertyFilter。未配置FilterProvider

在org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)

我在服务器端遇到了类似的问题,并且可以通过给Jackson 如下所示来解决此问题(在此职位的帮助下):FilterProviderObjectMapper

ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
Run Code Online (Sandbox Code Playgroud)

我可以在RestTemplate端做类似的事情吗?任何有关如何解决此问题的想法都将受到赞赏。

为了清楚起见,在客户端RestTemplate端,我根本不想过滤域对象属性。

Jus*_*tin 5

我可以指定Spring的RestTemplate使用的Jackson ObjectMapper吗?

通过执行以下操作,我可以强制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);
Run Code Online (Sandbox Code Playgroud)

该网站提供了部分上述代码的示例。