Spring RestTemplate与杰克逊投掷"无法解决BeanPropertyFilter"使用@JsonFilter时

时间:2012-02-22 14:49:08

标签: spring jackson

我可以指定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方面,我根本不想过滤域对象属性。

1 个答案:

答案 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为上述部分代码提供了示例。