Spring Boot2.x LocalDateTime 序列化

用Mybatis Plus生成的entity是LocalDateTime,Spring MVC的接口返回中直接返回了生成的Entity, 結果序列化爲json的時候出問題了。
一般處理是有兩種方式,在entity的property上加上JsonFormat,如

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime createTime;

這樣返回的json能正確返回yyyy-MM-dd格式的時間。但是比較麻煩,需要將每一個property加上。
是否能全局配置轉換的方法呢。在網上https://www.cnblogs.com/carrychan/p/9883172.html有朋友寫了一個demo, 我馬上試了其中的方案一與三,結果不行哦。api接口返回的是數組。
調試發現,沒有使用全局配置的序列化類。於是我嘗試對屬性強制配置序列化類:

@JsonDeserialize(using = MyLocalDateTimeDeserializer.class)
private LocalDateTime updateTime;

public class MyLocalDateTimeSerializer extends StdSerializer<LocalDateTime> {
    private static final long serialVersionUID = 1L;

    private static String dataFormat = "yyyy-MM-dd HH:mm:ss";

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(DateTimeFormatter.ofPattern(dataFormat).format(value));

    }
}

測試發現可以了,能正確返回字符串時間。這也需要一個一個加註解,麻煩啊。自動生成一下又還原了,不滿足需要。
再到網上找啊找,終於發現了一篇文章https://www.cnblogs.com/anemptycup/p/11313481.html
說工程中配置了攔截器,需要重新配置一下Jackson。

@Bean
public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    // 對於空的對象轉json的時候不拋出錯誤
    objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    // 禁用遇到未知屬性拋出異常
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    // 序列化BigDecimal時不使用科學計數法輸出
    objectMapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
    // 日期和時間格式化
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
    javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
    objectMapper.registerModule(javaTimeModule);
    jsonConverter.setObjectMapper(objectMapper);
    return jsonConverter;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(customJackson2HttpMessageConverter());
}

這下全局配置成功了。大功告成!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章