From 44089542159aeb7875b88512f33a5ee5f6461139 Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Wed, 9 Aug 2023 17:15:02 +0800 Subject: [PATCH] Serialize Long using string if exceeds the front-end maximum --- .../common/web/ObjectMapperConfiguration.java | 21 ++++++++++++ .../web/WebCommonAutoConfiguration.java | 3 +- .../web/support/LongToStringSerializer.java | 33 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 commons/web-common/src/main/java/com/schbrain/common/web/ObjectMapperConfiguration.java create mode 100644 commons/web-common/src/main/java/com/schbrain/common/web/support/LongToStringSerializer.java diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/ObjectMapperConfiguration.java b/commons/web-common/src/main/java/com/schbrain/common/web/ObjectMapperConfiguration.java new file mode 100644 index 0000000..ec754bd --- /dev/null +++ b/commons/web-common/src/main/java/com/schbrain/common/web/ObjectMapperConfiguration.java @@ -0,0 +1,21 @@ +package com.schbrain.common.web; + +import com.schbrain.common.web.support.LongToStringSerializer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; + +/** + * @author liaozan + * @since 2023/8/9 + */ +@ConditionalOnClass(Jackson2ObjectMapperBuilder.class) +public class ObjectMapperConfiguration { + + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { + return builder -> builder.serializerByType(Long.class, LongToStringSerializer.instance); + } + +} diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/WebCommonAutoConfiguration.java b/commons/web-common/src/main/java/com/schbrain/common/web/WebCommonAutoConfiguration.java index f658e37..5c53825 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/WebCommonAutoConfiguration.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/WebCommonAutoConfiguration.java @@ -29,7 +29,8 @@ import java.util.List; AuthenticationConfiguration.class, ExceptionHandingConfiguration.class, ServletComponentConfiguration.class, - CorsFilterConfiguration.class + CorsFilterConfiguration.class, + ObjectMapperConfiguration.class }) public class WebCommonAutoConfiguration { diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/support/LongToStringSerializer.java b/commons/web-common/src/main/java/com/schbrain/common/web/support/LongToStringSerializer.java new file mode 100644 index 0000000..f272aba --- /dev/null +++ b/commons/web-common/src/main/java/com/schbrain/common/web/support/LongToStringSerializer.java @@ -0,0 +1,33 @@ +package com.schbrain.common.web.support; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +/** + * @author liaozan + * @since 2023/8/9 + */ +public class LongToStringSerializer extends StdSerializer { + + public static final LongToStringSerializer instance = new LongToStringSerializer(); + + private static final double FRONT_MAX_VALUE = Math.pow(2, 53); + private static final long serialVersionUID = -1872783127429540811L; + + protected LongToStringSerializer() { + super(Long.class); + } + + @Override + public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException { + if (value.doubleValue() > FRONT_MAX_VALUE) { + gen.writeString(value.toString()); + } else { + gen.writeNumber(value); + } + } + +} -- GitLab