我想更新Spring RestTemplate使用的jackson映射器的SerializationConfig.Feature ...屬性,不知道如何獲取它或我可以/應該配置它。如何在使用RestTemplate時配置內部Jackson映射器?
回答
默認RestTemplate
構造登記了一套HttpMessageConverter
S:
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter());
this.messageConverters.add(new SourceHttpMessageConverter());
this.messageConverters.add(new XmlAwareFormHttpMessageConverter());
if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jacksonPresent) {
this.messageConverters.add(new MappingJacksonHttpMessageConverter());
}
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
輪流的MappingJacksonHttpMessageConverter
,直接創造ObjectMapper
實例。您可以找到該轉換器並替換ObjectMapper
或在其之前註冊一個新轉換器。這應該工作:
@Bean
public RestOperations restOperations() {
RestTemplate rest = new RestTemplate();
//this is crucial!
rest.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
return rest;
}
@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(myObjectMapper());
return converter;
}
@Bean
public ObjectMapper myObjectMapper() {
//your custom ObjectMapper here
}
在XML是沿着這些路線的東西:
<bean id="restOperations" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<util:list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="customObjectMapper"/>
</bean>
</util:list>
</property>
</bean>
<bean id="customObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>
注意,轉變是不是真的1:1 - 我要明確地建立在XML messageConverters
列表,同時用@Configuration
方法我可以參考現有的並簡單地修改它。但這應該工作。
RestTemplate將初始化其默認消息轉換器。你應該用你自己的bean代替MappingJackson2HttpMessageConverter
,它應該使用你想要使用的對象映射器。這爲我工作:
@Bean
public RestTemplate restTemplate() {
final RestTemplate restTemplate = new RestTemplate();
//find and replace Jackson message converter with our own
for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {
final HttpMessageConverter<?> httpMessageConverter = restTemplate.getMessageConverters().get(i);
if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter){
restTemplate.getMessageConverters().set(i, mappingJackson2HttpMessageConverter);
}
}
return restTemplate;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(myObjectMapper());
return converter;
}
@Bean
public ObjectMapper myObjectMapper() {
// return your own object mapper
}
似乎命名方法類似於'myObjectMapper()'而不僅僅是'objectMapper()'是很重要的。出於某種原因,它似乎永遠不會調用該方法,並且您將獲得默認的「ObjectMapper」。 – herman 2016-06-15 14:45:03
如果不使用Spring IoC,你可以做這樣的事情(的Java 8):
ObjectMapper objectMapper = new ObjectMapper();
// configure your ObjectMapper here
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setPrettyPrint(false);
messageConverter.setObjectMapper(objectMapper);
restTemplate.getMessageConverters().removeIf(m -> m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
restTemplate.getMessageConverters().add(messageConverter);
要完成其他答案:如果你ObjectMapper
只是註冊了一個傑克遜Module
自定義串行/解串器,您可能要對現有ObjectMapper
從RestTemplate
的默認MappingJackson2HttpMessageConverter
直接登錄你的模塊如下(不包括DI的例子,但同樣適用,如果使用DI):
SimpleModule module = new SimpleModule();
module.addSerializer(...);
module.addDeserializer(...);
MappingJackson2HttpMessageConverter messageConverter = restTemplate.getMessageConverters().stream()
.filter(MappingJackson2HttpMessageConverter.class::isInstance)
.map(MappingJackson2HttpMessageConverter.class::cast)
.findFirst().orElseThrow(() -> new RuntimeException("MappingJackson2HttpMessageConverter not found"));
messageConverter.getObjectMapper().registerModule(module);
這將允許您完成原始ObjectMapper
(由Spring的Jackson2ObjectMapperBuilder
完成)的配置,而不是替換它。
- 1. JACKSON映射XML配置無註釋
- 2. RestTemplate - Jackson解串器
- 3. 春RestTemplate行映射
- 4. 使用fork時如何映射內存?
- 5. 如何映射的XML對象由RestTemplate
- 6. 自動映射器配置
- 7. Spring RestTemplate自定義映射
- 8. RestTemplate映射到對象
- 9. 何時使用內存映射文件?
- 10. Jackson:映射嵌套對象
- 11. 如何使用jackson ObjectMapper將POJO映射到自定義地圖?
- 12. 如何在使用json4s時設置Jackson解析器功能?
- 13. 如何在映射器中設置值?
- 14. 使用appsettings.json來配置DbContext映射
- 15. Jackson對象映射器如何忽略JsonProperty註釋?
- 16. 在使用OR映射器時隱藏屬性設置器
- 17. 如何在類庫項目中配置自動映射器?
- 18. 如何在AutoMapper中映射對象時使用外部類?
- 19. LINQ to SQL映射不使用屬性或外部XML配置
- 20. 當使用MultithreadMapper替換映射器時,映射鍵的類型不匹配
- 21. 映射控制器內部的路由
- 22. 映射註冊時丟失類型映射配置或不支持的映射
- 23. 數據映射器 - 在路由中創建流利映射器配置
- 24. 如何使用ButterKnife內部適配器
- 25. 在Java中的另一個數據映射器內使用數據映射器?
- 26. 如何在spring dispatcher servlet中配置jackson?
- 27. 何時使用映射框架,何時手動映射?
- 28. 映射使用自動映射器
- 29. 如何使用FluentHibernate配置多個映射?
- 30. 如何使用升壓C++屬性映射從配置文件
如果你能把它翻譯成XML,我將不勝感激。真的想試試這個,但不知道如何配置它。非常感謝! – Justin 2012-02-24 20:24:13
@Justin:做我的客人 - 看到更新的答案。 – 2012-02-24 21:32:09
不知道這是否僅僅是由於版本差異,但我相信傑克遜轉換器類的正確名稱是MappingJackson * 2 * HttpMessageConverter – nbrooks 2015-09-17 22:05:24