我可以指定Spring ObjectMapper
使用的杰克逊RestTemplate
吗?
我不是100%这就是我需要做的事情,但请参阅下面的详细信息。
背景 在this StackOverflow post的帮助下,我将@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
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
为了简洁省略了剩余的堆栈跟踪
引起:org.codehaus.jackson.map.JsonMappingException:无法解析ID为'apiFilter'的BeanPropertyFilter;没有配置FilterProvider
at org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)
我在服务器端遇到了类似的问题,并且能够通过FilterProvider
向杰克逊ObjectMapper
提供ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
来解决问题(在this post的帮助下),如下所示:
{{1}}
我可以在RestTemplate方面做类似的事情吗?如何解决这个问题的任何想法都值得赞赏。
为了清楚起见,在客户端RestTemplate方面,我根本不想过滤域对象属性。
答案 0 :(得分:4)
我可以指定Spring的RestTemplate使用的Jackson ObjectMap吗?
我可以通过执行以下操作强制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为上述部分代码提供了示例。