Commit 472ff81dd9d1ab7615bad57829270da439530cc6

Authored by 芋道源码
Committed by Gitee
2 parents 11b8afc4 4067087d

!17 新增序列化Long类型,自动转为字符串类型,避免前端丢失精度

Merge pull request !17 from 贺小五/feature/serialized
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.deser.LocalDateTimeDeserializer;
  4 +import cn.iocoder.dashboard.framework.jackson.ser.LocalDateTimeSerializer;
3 5 import cn.iocoder.dashboard.util.json.JsonUtils;
4 6 import com.fasterxml.jackson.databind.ObjectMapper;
  7 +import com.fasterxml.jackson.databind.module.SimpleModule;
  8 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
5 9 import org.springframework.context.annotation.Bean;
6 10 import org.springframework.context.annotation.Configuration;
7 11  
  12 +import java.time.LocalDateTime;
  13 +
8 14 @Configuration
9 15 public class JacksonConfig {
10 16  
11 17 @Bean
12 18 @SuppressWarnings("InstantiationOfUtilityClass")
13 19 public JsonUtils jsonUtils(ObjectMapper objectMapper) {
  20 + SimpleModule simpleModule = new SimpleModule();
  21 + /*
  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);
  31 +
14 32 JsonUtils.init(objectMapper);
15 33 return new JsonUtils();
16 34 }
17   -
18 35 }
... ...
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/LocalDateTimeSerializer.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.jackson.ser;
  2 +
  3 +import com.fasterxml.jackson.core.JsonGenerator;
  4 +import com.fasterxml.jackson.databind.JsonSerializer;
  5 +import com.fasterxml.jackson.databind.SerializerProvider;
  6 +
  7 +import java.io.IOException;
  8 +import java.time.LocalDateTime;
  9 +import java.time.ZoneId;
  10 +
  11 +/**
  12 + * LocalDateTime序列化规则
  13 + * <p>
  14 + * 会将LocalDateTime序列化为毫秒级时间戳
  15 + */
  16 +public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
  17 +
  18 + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();
  19 +
  20 + @Override
  21 + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  22 + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  23 + }
  24 +}
... ...