Java 使用相同的RestTemplate';s对象映射器,用于独立对象映射器
以下是我的设置: 带有自定义Java 使用相同的RestTemplate';s对象映射器,用于独立对象映射器,java,spring-boot,resttemplate,objectmapper,jackson2,Java,Spring Boot,Resttemplate,Objectmapper,Jackson2,以下是我的设置: 带有自定义MessageConverter的ObjectMapper的restemplate,具有一些反序列化功能和问题处理程序(Jackson Fasterxml 2.8.9)。restemplate也有一个自定义的ResponseErrorHandler 在使用restemplate进行REST调用期间,如果响应状态需要由ResponseErrorHandler处理,我可能必须解析流体并将其映射到对象 我想知道,如果我能将我的ObjectMapper变成一个bean(@be
MessageConverter
的ObjectMapper
的restemplate
,具有一些反序列化功能和问题处理程序(Jackson Fasterxml 2.8.9)。restemplate
也有一个自定义的ResponseErrorHandler
在使用restemplate
进行REST调用期间,如果响应状态需要由ResponseErrorHandler
处理,我可能必须解析流体并将其映射到对象
我想知道,如果我能将我的ObjectMapper
变成一个bean(@bean
/@qualifier
),我能在restemplate
的ObjectMapper
中使用这个单例bean,并将它作为依赖项注入相同的restemplate
的resteerrorHandler
?这样安全吗
我之所以要这样做,是因为在数据绑定方面,所有反序列化功能和问题处理程序都应该是相同的——无论是发生在
restemplate
数据提取机制内部,还是需要在ResponseErrorHandler#handleError()期间映射响应主体
定义对象映射器和RESTTemplatebean
或者在每次创建模板时手动重新创建模板
请记住将转换器添加为列表中的第一个转换器
@Bean
public RestTemplate restTemplate() {
RestTemplate rest = new RestTemplate();
// Add the object mapper as first instance in list for eager discovery
rest.getMessageConverters().add(0, jacksonConverter());
return rest;
}
@Bean
public HttpMessageConverter jacksonConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(objectMapper());
return converter;
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
这个问题的上下文可能重复,这是不同的。您必须遍历
restemplate
提供的所有MessageConverter
,以找到合适的转换器并获取其ObjectMapper
。当restemplate
提取数据时,它在内部使用此ObjectMapper
,因此我不确定在返回restemplate
之前,如果在同一restemplate
的自定义resteErrorHandler
中再次使用,它处于什么状态。是的,问题是,我可以安全地在自定义的restemplate
的resteErrorHandler
中使用@Bean ObjectMapper
从流中反序列化,即使它将是restemplate
用于提取数据的同一个Bean对象(请参见restemplate
——另请注意第691行)