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

相关文章
相关标签/搜索