Commit 4067087da6f8615ef3ad07ed03c8332be18e1c90

Authored by hexiaowu
1 parent fe31d61d

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

新增LocalDateTime的序列化、反序列化规则
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java
1 package cn.iocoder.dashboard.framework.jackson.config; 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 import cn.iocoder.dashboard.util.json.JsonUtils; 5 import cn.iocoder.dashboard.util.json.JsonUtils;
5 import com.fasterxml.jackson.databind.ObjectMapper; 6 import com.fasterxml.jackson.databind.ObjectMapper;
6 import com.fasterxml.jackson.databind.module.SimpleModule; 7 import com.fasterxml.jackson.databind.module.SimpleModule;
  8 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
7 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Bean;
8 import org.springframework.context.annotation.Configuration; 10 import org.springframework.context.annotation.Configuration;
9 11
  12 +import java.time.LocalDateTime;
  13 +
10 @Configuration 14 @Configuration
11 public class JacksonConfig { 15 public class JacksonConfig {
12 16
@@ -15,11 +19,15 @@ public class JacksonConfig { @@ -15,11 +19,15 @@ public class JacksonConfig {
15 public JsonUtils jsonUtils(ObjectMapper objectMapper) { 19 public JsonUtils jsonUtils(ObjectMapper objectMapper) {
16 SimpleModule simpleModule = new SimpleModule(); 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 JsonUtils.init(objectMapper); 32 JsonUtils.init(objectMapper);
25 return new JsonUtils(); 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,22 +5,20 @@ import com.fasterxml.jackson.databind.JsonSerializer;
5 import com.fasterxml.jackson.databind.SerializerProvider; 5 import com.fasterxml.jackson.databind.SerializerProvider;
6 6
7 import java.io.IOException; 7 import java.io.IOException;
  8 +import java.time.LocalDateTime;
  9 +import java.time.ZoneId;
8 10
9 /** 11 /**
10 - * Long类型序列化规则 12 + * LocalDateTime序列化规则
11 * <p> 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 @Override 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 }