【问题标题】:Spring RestTemplate with Jackson as HttpMessageConverter and joda DateTime property fails to deserializeSpring RestTemplate 与 Jackson 作为 HttpMessageConverter 和 joda DateTime 属性无法反序列化
【发布时间】:2014-02-16 19:00:03
【问题描述】:

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

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。

@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 对象,并显示以下错误消息:

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。有人知道我在这里缺少什么吗?

【问题讨论】:

    标签: spring jackson jodatime jackson-modules


    【解决方案1】:

    好的,我的 createRestTemplate() 方法中缺少这一行。

    restTemplate.setMessageConverters(messageConverters);
    

    【讨论】:

    • 我很困惑 - 那行在你原来的问题中?
    • 原来没有。
    • 也许它不应该在原件中显示您的错误?只是做了同样的事情;-)
    【解决方案2】:

    添加依赖

          <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>2.9.0.pr4</version>
        </dependency>
    

    并使用 DateTimeDeserializer.class 进行反序列化,如下所示

    @JsonDeserialize(using = DateTimeDeserializer.class)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy", timezone = "Europe/Berlin")
    private DateTime date;
    

    对我来说很好。无需添加自定义消息转换器。

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2018-03-14
      • 2013-09-25
      • 2014-10-13
      • 1970-01-01
      • 2017-01-21
      • 2018-07-20
      • 2015-10-06
      • 2015-01-11
      相关资源
      最近更新 更多