# java8时间的序列化与反序列化

back

# 启动类调整

@SpringBootApplication
public class ElasticApplication {

    @Autowired
    private ObjectMapper objectMapper;

    public static void main(String[] args) {
        SpringApplication.run(ElasticApplication.class, args);
    }

    @PostConstruct
    public void justifyTimeModule() {
        objectMapper.registerModule(new JavaTimeModule());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 重写spring的Formatter

package com.htring.demo.elastic.config;

import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.format.Formatter;

import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

/**
 * <p>Title: JacksonConfig</p>
 * <p>Description: Jackson在springboot项目中是通过JacksonAutoConfiguration自动配置的,
 * 我们需要在jackson自动配置之前把设置的java8的序列化器和反序列化器配置进去。</p>
 *
 * @author hu-ting
 * @version v1.0.0
 * @date 2020/12/8 14:05
 */
//@Configuration
//@ConditionalOnClass(ObjectMapper.class)
//@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfig {
    public static final String DEFAULT_DATE_TIME_FORMATTER = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_FORMATTER = "yyyy-MM-dd";
    public static final String DEFAULT_TIME_FORMATTER = "HH:mm:ss";

//    @Bean
    public Jackson2ObjectMapperBuilderCustomizer myCustom() {
        return builder -> builder
                .deserializerByType(
                        LocalDateTime.class,
                        new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMATTER)))
                .serializerByType(
                        LocalDateTime.class,
                        new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMATTER)));
    }

//    @Bean
    public Formatter<LocalDateTime> localDateTimeFormatter() {
        return new Formatter<LocalDateTime>() {
            @Override
            public LocalDateTime parse(String text, Locale locale) throws ParseException {
                return LocalDateTime.parse(text, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMATTER));
            }

            @Override
            public String print(LocalDateTime object, Locale locale) {
                return object.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMATTER));
            }
        };
    }

//    @Bean
    public Formatter<LocalDate> localDateFormatter() {
        return new Formatter<LocalDate>() {
            @Override
            public LocalDate parse(String text, Locale locale) throws ParseException {
                return LocalDate.parse(text, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMATTER));
            }

            @Override
            public String print(LocalDate object, Locale locale) {
                return object.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMATTER));
            }
        };
    }

//    @Bean
    public Formatter<LocalTime> localTimeFormatter() {
        return new Formatter<LocalTime>() {
            @Override
            public LocalTime parse(String text, Locale locale) throws ParseException {
                return LocalTime.parse(text, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMATTER));
            }

            @Override
            public String print(LocalTime object, Locale locale) {
                return object.format(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMATTER));
            }
        };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87