spring-cloud-feign 對 Java8 日期的序列化

spring-cloud-feign 對 Java8 日期的序列化

前言

若是用過spring-cloud的同窗應該知道,feign接口默認底層默認是http來進行請求的,通常spring的web項目都是經過Jackson來進行序列化跟反序列化,在對象傳輸的時候,若是對象裏面的時間類型是Java8的時間類,可能會反序列化失敗,所以,咱們須要配置一下針對Java8提供的時間類進行定製的序列化,所以,咱們默認使用LocalDateTime示例,LocalDateLocalTime實際上也是同樣的java

引入JSR310依賴

在項目內,咱們引用下依賴web

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

使用JSR310默認配置

默認的狀況下,JSR310給咱們提供了轉換成字符串的序列化/反序列化類,分別是LocalDateTimeSerializer/LocalDateTimeDeserializer,咱們可使用已經有的實現,來進行序列化spring

接着咱們經過Spring的自動裝配,返回一個Beanapp

@Configuration
public class JacksonSerializerConfiguration{

    @Bean
    public ObjectMapper buildObjectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                      .addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
              
        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }
}

使用自定義配置

固然,咱們不想使用默認的,咱們也能夠自定義配置,繼承JsonSerializer類,實現抽象方法,或者繼承JSR310InstantSerializer類,而後重寫構造器,做爲示例,咱們就繼承JsonSerializer做爲演示ide

例如,咱們想序列化LocalDateTime到秒的時間戳,代碼以下ui

public class InstantSerializer extends JsonSerializer<LocalDateTime> {

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeNumber(DateUtils.toSecond(value));
    }
}

public class InstantDeserializer extends JsonDeserializer<LocalDateTime> {

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext txt) throws IOException, JsonProcessingException {
        return Instant.ofEpochSecond(p.getLongValue()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
}

@Configuration
public class JacksonSerializerConfiguration{

    @Bean
    public ObjectMapper buildObjectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new InstantSerializer())
                      .addDeserializer(LocalDateTime.class,new InstantDeserializer());
                      
        objectMapper.registerModule(javaTimeModule);  
        return objectMapper;
    }
}

總結

JSR310給咱們不少的基礎實現,簡單的可使用基礎的實現,若是要自定義的話,經過繼承jackson提供的抽象類,本身進行實現,二者實現上差很少,不過經過繼承更靈活,更可控,使用jsr310更方便,具體的使用就仁者見仁智者見智了code

相關文章
相關標籤/搜索