【问题标题】:Using the Same RestTemplate's ObjectMapper for a Standalone ObjectMapper对独立的 ObjectMapper 使用相同的 RestTemplate 的 ObjectMapper
【发布时间】:2020-01-12 19:57:23
【问题描述】:

这是我的设置:

带有自定义MessageConverterObjectMapperRestTemplate 具有一些反序列化功能和问题处理程序(Jackson Fasterxml 2.8.9)。 RestTemplate 也有一个自定义的ResponseErrorHandler

在使用RestTemplate 进行REST 调用期间,如果需要由ResponseErrorHandler 处理响应状态,我可能必须解析流体并将其映射到对象。

我想知道,如果我可以让我的 ObjectMapper 成为一个 bean (@Bean/@Qualifer),我是否能够在 RestTemplateObjectMapper 中使用这个单例 bean,并注入它作为 same RestTemplate's ResponseErrorHandler 的依赖项?那会安全吗?

我想这样做的原因是,在数据绑定方面,所有反序列化功能和问题处理程序都应该是相同的——无论是发生在 RestTemplate 数据提取机制内部还是需要映射响应主体时在ResponseErrorHandler#handlerError()期间。

【问题讨论】:

  • 这个问题的上下文不同。必须遍历RestTemplate 提供的所有MessageConverter,以找到合适的ObjectMapper。当RestTemplate提取数据时,在内部它使用这个ObjectMapper,所以我不确定如果在相同RestTemplate的自定义ResponseErrorHandler内部再次使用它是什么状态在返回 RestTemplate 之前。

标签: java spring-boot resttemplate objectmapper jackson2


【解决方案1】:

定义对象映射器和 RestTemplate bean。

或者每次创建时手动 RestTemplate。

记得将转换器添加为列表中的第一个转换器。

@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();
}

【讨论】:

  • 是的,问题是,我可以安全地在我的 custom RestTemplate's ResponseErrorHandler 中使用 @Bean ObjectMapper 从流中反序列化,即使它正在运行与 RestTemplate 用于提取数据的 bean 对象相同(参见 RestTemplate code here -- 另请注意第 691 行)
猜你喜欢
  • 2021-12-13
  • 2017-12-22
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2016-06-12
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多