mirror of
				https://github.com/continew-org/continew-starter.git
				synced 2025-11-04 09:01:40 +08:00 
			
		
		
		
	refactor(json/jackson): 优化部分代码
This commit is contained in:
		@@ -21,7 +21,6 @@ import java.time.LocalDate;
 | 
				
			|||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.time.LocalTime;
 | 
					import java.time.LocalTime;
 | 
				
			||||||
import java.time.format.DateTimeFormatter;
 | 
					import java.time.format.DateTimeFormatter;
 | 
				
			||||||
import java.util.Objects;
 | 
					 | 
				
			||||||
import java.util.TimeZone;
 | 
					import java.util.TimeZone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
@@ -45,7 +44,6 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
 | 
				
			|||||||
import cn.hutool.core.date.DatePattern;
 | 
					import cn.hutool.core.date.DatePattern;
 | 
				
			||||||
import top.continew.starter.core.enums.BaseEnum;
 | 
					import top.continew.starter.core.enums.BaseEnum;
 | 
				
			||||||
import top.continew.starter.core.util.GeneralPropertySourceFactory;
 | 
					import top.continew.starter.core.util.GeneralPropertySourceFactory;
 | 
				
			||||||
import top.continew.starter.json.jackson.enums.BigNumberSerializeModeEnum;
 | 
					 | 
				
			||||||
import top.continew.starter.json.jackson.serializer.BaseEnumDeserializer;
 | 
					import top.continew.starter.json.jackson.serializer.BaseEnumDeserializer;
 | 
				
			||||||
import top.continew.starter.json.jackson.serializer.BaseEnumSerializer;
 | 
					import top.continew.starter.json.jackson.serializer.BaseEnumSerializer;
 | 
				
			||||||
import top.continew.starter.json.jackson.serializer.BigNumberSerializer;
 | 
					import top.continew.starter.json.jackson.serializer.BigNumberSerializer;
 | 
				
			||||||
@@ -55,30 +53,30 @@ import top.continew.starter.json.jackson.serializer.SimpleDeserializersWrapper;
 | 
				
			|||||||
 * Jackson 自动配置
 | 
					 * Jackson 自动配置
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @author Charles7c
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @author Jasmine
 | 
				
			||||||
 * @since 1.0.0
 | 
					 * @since 1.0.0
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@AutoConfiguration
 | 
					@AutoConfiguration
 | 
				
			||||||
@EnableConfigurationProperties(JacksonProperties.class)
 | 
					@EnableConfigurationProperties(JacksonExtensionProperties.class)
 | 
				
			||||||
@PropertySource(value = "classpath:default-json-jackson.yml", factory = GeneralPropertySourceFactory.class)
 | 
					@PropertySource(value = "classpath:default-json-jackson.yml", factory = GeneralPropertySourceFactory.class)
 | 
				
			||||||
public class JacksonAutoConfiguration {
 | 
					public class JacksonAutoConfiguration {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final Logger log = LoggerFactory.getLogger(JacksonAutoConfiguration.class);
 | 
					    private static final Logger log = LoggerFactory.getLogger(JacksonAutoConfiguration.class);
 | 
				
			||||||
 | 
					    private final JacksonExtensionProperties properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final JacksonProperties jacksonProperties;
 | 
					    public JacksonAutoConfiguration(JacksonExtensionProperties properties) {
 | 
				
			||||||
 | 
					        this.properties = properties;
 | 
				
			||||||
    public JacksonAutoConfiguration(JacksonProperties jacksonProperties) {
 | 
					 | 
				
			||||||
        this.jacksonProperties = jacksonProperties;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Bean
 | 
					    @Bean
 | 
				
			||||||
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
 | 
					    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
 | 
				
			||||||
        return builder -> {
 | 
					        return builder -> {
 | 
				
			||||||
 | 
					            JavaTimeModule javaTimeModule = this.javaTimeModule();
 | 
				
			||||||
            JavaTimeModule javaTimeModule = this.timeModule();
 | 
					            SimpleModule baseEnumModule = this.baseEnumModule();
 | 
				
			||||||
            SimpleModule enumModule = this.baseEnumModule();
 | 
					 | 
				
			||||||
            SimpleModule bigNumberModule = this.bigNumberModule();
 | 
					            SimpleModule bigNumberModule = this.bigNumberModule();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            builder.timeZone(TimeZone.getDefault());
 | 
					            builder.timeZone(TimeZone.getDefault());
 | 
				
			||||||
            builder.modules(javaTimeModule, enumModule, bigNumberModule);
 | 
					            builder.modules(javaTimeModule, baseEnumModule, bigNumberModule);
 | 
				
			||||||
            log.debug("[ContiNew Starter] - Auto Configuration 'Jackson' completed initialization.");
 | 
					            log.debug("[ContiNew Starter] - Auto Configuration 'Jackson' completed initialization.");
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -86,10 +84,10 @@ public class JacksonAutoConfiguration {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 日期时间序列化及反序列化配置
 | 
					     * 日期时间序列化及反序列化配置
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return JavaTimeModule /
 | 
					     * @return {@link JavaTimeModule}
 | 
				
			||||||
     * @since 1.0.0
 | 
					     * @since 1.0.0
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private JavaTimeModule timeModule() {
 | 
					    private JavaTimeModule javaTimeModule() {
 | 
				
			||||||
        JavaTimeModule javaTimeModule = new JavaTimeModule();
 | 
					        JavaTimeModule javaTimeModule = new JavaTimeModule();
 | 
				
			||||||
        // 针对时间类型:LocalDateTime 的序列化和反序列化处理
 | 
					        // 针对时间类型:LocalDateTime 的序列化和反序列化处理
 | 
				
			||||||
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
 | 
					        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
 | 
				
			||||||
@@ -125,21 +123,23 @@ public class JacksonAutoConfiguration {
 | 
				
			|||||||
     * 大数值序列化及反序列化配置
 | 
					     * 大数值序列化及反序列化配置
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return SimpleModule /
 | 
					     * @return SimpleModule /
 | 
				
			||||||
     * @since 2.12.0
 | 
					     * @since 2.12.1
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private SimpleModule bigNumberModule() {
 | 
					    private SimpleModule bigNumberModule() {
 | 
				
			||||||
        SimpleModule bigNumberModule = new SimpleModule();
 | 
					        SimpleModule bigNumberModule = new SimpleModule();
 | 
				
			||||||
        if (Objects.equals(jacksonProperties.getBigNumberSerializeMode(), BigNumberSerializeModeEnum.FLEXIBLE)) {
 | 
					        switch (properties.getBigNumberSerializeMode()) {
 | 
				
			||||||
            bigNumberModule.addSerializer(Long.class, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
					            case FLEXIBLE -> {
 | 
				
			||||||
            bigNumberModule.addSerializer(Long.TYPE, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
					                bigNumberModule.addSerializer(Long.class, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
				
			||||||
            bigNumberModule.addSerializer(BigInteger.class, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
					                bigNumberModule.addSerializer(Long.TYPE, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
				
			||||||
        } else if (Objects.equals(jacksonProperties
 | 
					                bigNumberModule.addSerializer(BigInteger.class, BigNumberSerializer.SERIALIZER_INSTANCE);
 | 
				
			||||||
            .getBigNumberSerializeMode(), BigNumberSerializeModeEnum.TO_STRING)) {
 | 
					            }
 | 
				
			||||||
            bigNumberModule.addSerializer(Long.class, ToStringSerializer.instance);
 | 
					            case TO_STRING -> {
 | 
				
			||||||
            bigNumberModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
 | 
					                bigNumberModule.addSerializer(Long.class, ToStringSerializer.instance);
 | 
				
			||||||
            bigNumberModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
 | 
					                bigNumberModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
 | 
				
			||||||
 | 
					                bigNumberModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            default -> log.warn("[ContiNew Starter] - Jackson 大数值序列化模式:NO_OPERATE,超过 JS 范围的数值会损失精度");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return bigNumberModule;
 | 
					        return bigNumberModule;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,27 +18,28 @@ package top.continew.starter.json.jackson.autoconfigure;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
					import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import top.continew.starter.json.jackson.enums.BigNumberSerializeModeEnum;
 | 
					import top.continew.starter.json.jackson.enums.BigNumberSerializeMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * jackson 配置属性
 | 
					 * Jackson 扩展配置属性
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @author Jasmine
 | 
					 * @author Jasmine
 | 
				
			||||||
 * @author Charles7c
 | 
					 * @author Charles7c
 | 
				
			||||||
 * @since 2.12.0
 | 
					 * @since 2.12.1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ConfigurationProperties("spring.jackson")
 | 
					@ConfigurationProperties("spring.jackson")
 | 
				
			||||||
public class JacksonProperties {
 | 
					public class JacksonExtensionProperties {
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 大数值类型序列化模式
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private BigNumberSerializeModeEnum bigNumberSerializeMode;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BigNumberSerializeModeEnum getBigNumberSerializeMode() {
 | 
					    /**
 | 
				
			||||||
 | 
					     * 大数值序列化模式
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private BigNumberSerializeMode bigNumberSerializeMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BigNumberSerializeMode getBigNumberSerializeMode() {
 | 
				
			||||||
        return bigNumberSerializeMode;
 | 
					        return bigNumberSerializeMode;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void setBigNumberSerializeMode(BigNumberSerializeModeEnum bigNumberSerializeMode) {
 | 
					    public void setBigNumberSerializeMode(BigNumberSerializeMode bigNumberSerializeMode) {
 | 
				
			||||||
        this.bigNumberSerializeMode = bigNumberSerializeMode;
 | 
					        this.bigNumberSerializeMode = bigNumberSerializeMode;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -21,13 +21,29 @@ package top.continew.starter.json.jackson.enums;
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @author Jasmine
 | 
					 * @author Jasmine
 | 
				
			||||||
 * @author Charles7c
 | 
					 * @author Charles7c
 | 
				
			||||||
 * @since 2.12.0
 | 
					 * @since 2.12.1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public enum BigNumberSerializeModeEnum {
 | 
					public enum BigNumberSerializeMode {
 | 
				
			||||||
    /** 超过js的最大值转字符串类型,否则保持原类型 */
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 超过 JS 范围的数值转为 {@link String} 类型,否则保持原类型
 | 
				
			||||||
 | 
					     * <p>
 | 
				
			||||||
 | 
					     * JS:Number.MIN_SAFE_INTEGER:-9007199254740991L <br />
 | 
				
			||||||
 | 
					     * JS:Number.MAX_SAFE_INTEGER:9007199254740991L
 | 
				
			||||||
 | 
					     * </p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    FLEXIBLE,
 | 
					    FLEXIBLE,
 | 
				
			||||||
    /** 不操作 */
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 统一转为 {@link String} 类型
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    TO_STRING,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 不操作(不建议)
 | 
				
			||||||
 | 
					     * <p>
 | 
				
			||||||
 | 
					     * 注意:超过 JS 范围的数值会损失精度,例如:8014753905961037835 会被转为 8014753905961038000
 | 
				
			||||||
 | 
					     * </p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    NO_OPERATE,
 | 
					    NO_OPERATE,
 | 
				
			||||||
    /** 统一转String类型 */
 | 
					 | 
				
			||||||
    TO_STRING,;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -21,5 +21,5 @@ spring:
 | 
				
			|||||||
    deserialization:
 | 
					    deserialization:
 | 
				
			||||||
      # 允许反序列化不存在的属性
 | 
					      # 允许反序列化不存在的属性
 | 
				
			||||||
      fail-on-unknown-properties: false
 | 
					      fail-on-unknown-properties: false
 | 
				
			||||||
    # 大数值序列化类型的转换
 | 
					    # 大数值序列化模式
 | 
				
			||||||
    big-number-serialize-mode: FLEXIBLE
 | 
					    big-number-serialize-mode: FLEXIBLE
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user