我想更新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