@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
}
6条答案
按热度按时间xsuvu9jc1#
默认的
RestTemplate
构造函数注册了一组HttpMessageConverter
:MappingJacksonHttpMessageConverter
依次直接创建ObjectMapper
示例。您可以找到此转换器并替换ObjectMapper
或在它之前注册一个新的转换器。这应该是可行的:在XML中,它是沿着这些行的东西:
请注意,转换并不是真正的1:1 -我必须在XML中显式创建
messageConverters
列表,而使用@Configuration
方法,我可以引用现有的列表并简单地修改它。不过,这个应该能行。k2arahey2#
如果你没有使用Spring IOC,你可以这样做(Java 8):
a0zr77ik3#
RestTemplate将初始化它的默认消息转换器。您应该用自己的bean替换
MappingJackson2HttpMessageConverter
,它应该使用您想要使用的对象Map器。这对我很有效:gev0vcfq4#
完成其他答案:如果你的
ObjectMapper
只是注册一个JacksonModule
与自定义序列化器/反序列化器,你可能想直接注册你的模块在现有的ObjectMapper
从RestTemplate
的默认MappingJackson2HttpMessageConverter
如下(例子没有DI,但同样适用于如果使用DI):这将允许您完成原始
ObjectMapper
的配置(如Spring的Jackson2ObjectMapperBuilder
所做的那样),而不是替换它。t9aqgxwy5#
使用Sping Boot ,就像这样简单:
(用 Spring Boot 2.2.1测试)
zqry0prt6#
要使用当前ObjectMapper更新SerializationConfig.特性,请执行以下操作: