在實際項目中,經常接口中會涉及到時間字段,但是不同系統用的時間類也不一樣,有些用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
就是添加各種跟時間類型有關的序列化以及反序列化組件。