2012-02-22 335 views
2

我可以指定Spring的RestTemplate使用的Jackson ObjectMapper嗎?使用@JsonFilter時,帶有Jackson的Spring RestTemplate會拋出「無法解析BeanPropertyFilter」

我不是100%,這是我需要做的,但看到下面的細節。

背景:this StackOverflow post我加@JsonFilter我的域類和編輯我的JAX-RS Web服務(在CXF實現)的幫助。我現在可以成功地動態選擇在我的RESTful API中返回哪些域類字段。到現在爲止還挺好。

我在我的JUnit測試中使用Spring的RestTemplate來測試我的RESTful API。直到我將@JasonFilter添加到我的域類中,這工作正常。現在,我得到以下異常:

org.springframework.web.client.ResourceAccessException: I/O error: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured

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

rest of stack trace omitted for brevity

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured

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

我得到在服務器端有類似的問題,並能夠解決它(從this post幫助)通過給FilterProvider到傑克遜ObjectMapper如下:

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

我可以在RestTemplate方面做類似的事嗎?任何想法如何解決這個問題,我們感激。

要清楚的是,在客戶端RestTemplate方面,我根本不想過濾域對象屬性。

回答

4

Can I specify the Jackson ObjectMapper that Spring's RestTemplate uses?

我能夠迫使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提供例如用於上面的代碼的一部分。

相關問題