spring boot項目關於LocalDate反序列化失敗問題


在實際項目中,經常接口中會涉及到時間字段,但是不同系統用的時間類也不一樣,有些用Date,有些用LocalDate,現在A調B服務時,報錯如下:

Caused by: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.time.LocalDate]; nested exception is com.fasterxml.jackson.databind.exc.
InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-12-06') at

其實解決這個問題也很簡單,想辦法讓其反序列化成功就行。

一、添加jar包

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.9.7</version>
</dependency>

二、加配置

import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @Component public class JsonObjectMapperConfig { @Bean public ObjectMapper ObjectMapper(){ SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(simpleModule); objectMapper.registerModule(new JavaTimeModule()); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return objectMapper; } }

然后問題就可以解決了。

三、說明

1、ObjectMapper

Jackson ObjectMapper類(com.fasterxml.jackson.databind.ObjectMapper)是使用Jackson解析JSON最簡單的方法;
Jackson ObjectMapper可以從字符串、流或文件解析JSON,並創建Java對象或對象圖來表示已解析的JSON。將JSON解析為Java對象也稱為從JSON反序列化Java對象;
Jackson ObjectMapper也可以從Java對象創建JSON. 從Java對象生成JSON的過程也被稱為序列化Java對象到JSON;
Jackson對象映射器(Object Mapper)可以把JSON解析為用戶自定義類對象, 或者解析為JSON內置的樹模型的對象;

說白了,就是將json與java對象之間互相轉換。

2、配置解釋

 @Bean public ObjectMapper ObjectMapper(){ // 可以將各種Module注冊到ObjectMapper中,每個Module中可以包含多個反序列化組件
        SimpleModule simpleModule = new SimpleModule(); // 添加將long轉成String的組件
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(simpleModule); // 將時間反序列化組件添加到ObjectMapper中
        objectMapper.registerModule(new JavaTimeModule()); // 禁止將時間類型數據轉換成時間戳
 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return objectMapper; }

再來看看JavaTimeModule

 

 就是添加各種跟時間類型有關的序列化以及反序列化組件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM