Commit 4067087da6f8615ef3ad07ed03c8332be18e1c90

Authored by hexiaowu
1 parent fe31d61d

移除自定义的Long序列化字符串类型规则

新增LocalDateTime的序列化、反序列化规则
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java
1 1 package cn.iocoder.dashboard.framework.jackson.config;
2 2  
3   -import cn.iocoder.dashboard.framework.jackson.ser.LongSerializer;
  3 +import cn.iocoder.dashboard.framework.jackson.deser.LocalDateTimeDeserializer;
  4 +import cn.iocoder.dashboard.framework.jackson.ser.LocalDateTimeSerializer;
4 5 import cn.iocoder.dashboard.util.json.JsonUtils;
5 6 import com.fasterxml.jackson.databind.ObjectMapper;
6 7 import com.fasterxml.jackson.databind.module.SimpleModule;
  8 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
7 9 import org.springframework.context.annotation.Bean;
8 10 import org.springframework.context.annotation.Configuration;
9 11  
  12 +import java.time.LocalDateTime;
  13 +
10 14 @Configuration
11 15 public class JacksonConfig {
12 16  
... ... @@ -15,11 +19,15 @@ public class JacksonConfig {
15 19 public JsonUtils jsonUtils(ObjectMapper objectMapper) {
16 20 SimpleModule simpleModule = new SimpleModule();
17 21 /*
18   - * 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
19   - */
20   - simpleModule.addSerializer(Long.class,LongSerializer.getInstance())
21   - .addSerializer(Long.TYPE,LongSerializer.getInstance());
22   - objectMapper.registerModule(simpleModule);
  22 + * 1. 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
  23 + * 2. 新增LocalDateTime序列化、反序列化规则
  24 + */
  25 + simpleModule.addSerializer(Long.class, ToStringSerializer.instance)
  26 + .addSerializer(Long.TYPE, ToStringSerializer.instance)
  27 + .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE)
  28 + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
  29 +
  30 + objectMapper.registerModules(simpleModule);
23 31  
24 32 JsonUtils.init(objectMapper);
25 33 return new JsonUtils();
... ...
src/main/java/cn/iocoder/dashboard/framework/jackson/deser/LocalDateTimeDeserializer.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.jackson.deser;
  2 +
  3 +import com.fasterxml.jackson.core.JsonParser;
  4 +import com.fasterxml.jackson.core.JsonProcessingException;
  5 +import com.fasterxml.jackson.databind.DeserializationContext;
  6 +import com.fasterxml.jackson.databind.JsonDeserializer;
  7 +
  8 +import java.io.IOException;
  9 +import java.time.Instant;
  10 +import java.time.LocalDateTime;
  11 +import java.time.ZoneId;
  12 +
  13 +/**
  14 + * LocalDateTime反序列化规则
  15 + * <p>
  16 + * 会将毫秒级时间戳反序列化为LocalDateTime
  17 + */
  18 +public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
  19 +
  20 + public static final LocalDateTimeDeserializer INSTANCE = new LocalDateTimeDeserializer();
  21 +
  22 + @Override
  23 + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
  24 + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault());
  25 + }
  26 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java renamed to src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LocalDateTimeSerializer.java
... ... @@ -5,22 +5,20 @@ import com.fasterxml.jackson.databind.JsonSerializer;
5 5 import com.fasterxml.jackson.databind.SerializerProvider;
6 6  
7 7 import java.io.IOException;
  8 +import java.time.LocalDateTime;
  9 +import java.time.ZoneId;
8 10  
9 11 /**
10   - * Long类型序列化规则
  12 + * LocalDateTime序列化规则
11 13 * <p>
12   - * 数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
  14 + * 会将LocalDateTime序列化为毫秒级时间戳
13 15 */
14   -public class LongSerializer extends JsonSerializer<Long> {
  16 +public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
15 17  
16   - private static final LongSerializer LONG_SERIALIZER = new LongSerializer();
  18 + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();
17 19  
18 20 @Override
19   - public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
20   - gen.writeString(value.toString());
21   - }
22   -
23   - public static LongSerializer getInstance() {
24   - return LONG_SERIALIZER;
  21 + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  22 + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
25 23 }
26 24 }
... ...