使用 Jackson 作为 HttpMessageConverter 和 joda DateTime 属性的 Spring RestTemplate 无法反序列化 [英] Spring RestTemplate with Jackson as HttpMessageConverter and joda DateTime property fails to deserialize

查看:32
本文介绍了使用 Jackson 作为 HttpMessageConverter 和 joda DateTime 属性的 Spring RestTemplate 无法反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

场景如下.我有一个注册 JodaModule 的 ObjectMapper(Jackson 2),能够序列化和反序列化 Joda DateTime 类型.此 ObjectMapper 已使用自定义 JSON 字符串进行测试并按预期工作.

The scenario is as follows. I have an ObjectMapper (Jackson 2) that registers a JodaModule, capable of serializing and de-serializing Joda DateTime type. This ObjectMapper is tested with custom JSON strings and works as expected.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
objectMapper.setDateFormat(new ISO8601DateFormat());
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;

我有一个 RestTemplateFactory 负责实例化一个 RestTemplate,并将之前配置的 ObjectMapper bean 设置为 RestTemplate.

I have an RestTemplateFactory which is responsible for instantiating a RestTemplate, and it sets the previously configured ObjectMapper bean to the RestTemplate.

@Configuration
public class RestTemplateFactory {

  @Autowired
  private ObjectMapper objectMapper;

  @Bean
  public RestTemplate createRestTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    // restTemplate.setMessageConverters(messageConverters); // This line was missing, but needs to be here. See answer.
    return restTemplate;
  }
}

现在,当我联系网络服务时,它无法反序列化 DateTime 对象并显示以下错误消息:

Now when I contact the webservice it fails to de-serialize the DateTime object with the following error message:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value; no single-String constructor/factory method

还有 DateTimeDeserializer.class 永远不会被调用.有人知道我在这里缺少什么吗?

Also the DateTimeDeserializer.class is never called. Anyone has an idea what I am missing here?

推荐答案

好的,我在 createRestTemplate() 方法中遗漏了这一行.

OK, I was missing this line in my createRestTemplate() method.

restTemplate.setMessageConverters(messageConverters);

这篇关于使用 Jackson 作为 HttpMessageConverter 和 joda DateTime 属性的 Spring RestTemplate 无法反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆