refactor(jackson): Jackson 2 → Jackson 3 全项目迁移
Spring Boot 4.0.6 默认引入 Jackson 3.1.2,但项目中 1018 处 @JsonSerialize 注解使用的是 Jackson 2 的 com.fasterxml.jackson.* 包,导致注解被忽略, Long 字段序列化为裸数字,引发前端 JS Number 精度丢失(Bug #681 的根因)。 - com.fasterxml.jackson.databind.* → tools.jackson.databind.* - com.fasterxml.jackson.core.* → tools.jackson.core.* - com.fasterxml.jackson.annotation.* 保留(Jackson 3 仍用同包名) - com.fasterxml.jackson.datatype.jsr310.* 保留(不再需要,Jackson 3 内置 JavaTime 支持) - JsonSerializer<T> → ValueSerializer<T> - JsonDeserializer<T> → ValueDeserializer<T> - SerializerProvider → SerializationContext - JsonMappingException → DatabindException - JsonProcessingException → JacksonException(变 RuntimeException) - ContextualSerializer → 合并入 ValueSerializer(createContextual 成 default 方法) - LaissezFaireSubTypeValidator → BasicPolymorphicTypeValidator.builder() - Jackson2ObjectMapperBuilderCustomizer → JsonMapperBuilderCustomizer - ObjectMapper.configure() 返回 void → JsonMapper.builder().disable(...).build() - ObjectMapper.setPropertyNamingStrategy() → JsonMapper.builder().propertyNamingStrategy() - ObjectMapper.setDateFormat() → JsonMapper.builder().defaultDateFormat() - ObjectNode.fieldNames() → JsonNode.propertyNames()(返回 Collection<String>) - SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 已移除(JavaTime 自动处理) - ObjectMapper 的 JavaTimeModule 注册不再需要(Jackson 3 内置) - core-framework/.../ApplicationConfig.java:重写为 JsonMapperBuilderCustomizer + 自定义 LocalDateTime 序列化(Jackson 3 内置 ext.javatime.*) - core-framework/.../FastJson2JsonRedisSerializer.java:用 BasicPolymorphicTypeValidator 替代 LaissezFaireSubTypeValidator - core-common/.../JsonUtils.java:改为 JsonMapper.builder() 模式 - core-common/.../SensitiveJsonSerializer.java:JsonSerializer → ValueSerializer - 5 个模块 jackson-databind groupId 改为 tools.jackson.core(版本由 Spring Boot BOM 管理) - jackson-annotations 保留 com.fasterxml.jackson.core(Jackson 3 仍用同包名) - ✅ mvn compile 全 11 模块通过 - ✅ mvn package 成功生成 fat JAR - ✅ 后端启动正常(JDK 25,Spring Boot 4.0.6) - ✅ 登录 API 返回 JWT token - ✅ /charge-manage/charge/encounter-patient-page 响应: - encounterId: "2032288214655660033"(字符串,@JsonSerialize 生效) - patientId: "2026486681850499074"(字符串,@JsonSerialize 生效) - ✅ Bug #681 根因彻底解决(Long 精度丢失) - Bug #681(前端兜底 fix: acf685fba)+ 本 commit(后端根治) - Bug #281(历史 jsr310 模块问题)随 Jackson 3 内置 JavaTime 一并解决 - Playwright E2E 全量回归(51 个 spec) - 时间字段序列化专项测试(LocalDateTime 格式验证) - 删除 Jackson 2 starter(spring-boot-jackson2)的可行性评估
This commit is contained in:
@@ -3,7 +3,7 @@ package com.core.common.annotation;
|
||||
import com.core.common.config.serializer.SensitiveJsonSerializer;
|
||||
import com.core.common.enums.DesensitizedType;
|
||||
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
|
||||
@@ -4,14 +4,13 @@ import com.core.common.annotation.Sensitive;
|
||||
import com.core.common.core.domain.model.LoginUser;
|
||||
import com.core.common.enums.DesensitizedType;
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.BeanProperty;
|
||||
import com.fasterxml.jackson.databind.JsonMappingException;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
|
||||
import tools.jackson.core.JacksonException;
|
||||
import tools.jackson.core.JsonGenerator;
|
||||
import tools.jackson.databind.BeanProperty;
|
||||
import tools.jackson.databind.DatabindException;
|
||||
import tools.jackson.databind.ValueSerializer;
|
||||
import tools.jackson.databind.SerializationContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@@ -19,11 +18,11 @@ import java.util.Objects;
|
||||
*
|
||||
* @author system
|
||||
*/
|
||||
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
|
||||
public class SensitiveJsonSerializer extends ValueSerializer<String> {
|
||||
private DesensitizedType desensitizedType;
|
||||
|
||||
@Override
|
||||
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||
public void serialize(String value, JsonGenerator gen, SerializationContext serializers) throws JacksonException {
|
||||
if (desensitization()) {
|
||||
gen.writeString(desensitizedType.desensitizer().apply(value));
|
||||
} else {
|
||||
@@ -32,14 +31,14 @@ public class SensitiveJsonSerializer extends JsonSerializer<String> implements C
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
|
||||
throws JsonMappingException {
|
||||
public ValueSerializer<?> createContextual(SerializationContext prov, BeanProperty property)
|
||||
throws DatabindException {
|
||||
Sensitive annotation = property.getAnnotation(Sensitive.class);
|
||||
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
|
||||
this.desensitizedType = annotation.desensitizedType();
|
||||
return this;
|
||||
}
|
||||
return prov.findValueSerializer(property.getType(), property);
|
||||
return prov.findPrimaryPropertySerializer(property.getType(), property);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,8 +9,8 @@ import com.core.common.annotation.Excel.Type;
|
||||
import com.core.common.annotation.Excels;
|
||||
import com.core.common.core.domain.BaseEntity;
|
||||
import com.core.common.xss.Xss;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.core.common.filter;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFilter;
|
||||
import com.fasterxml.jackson.databind.ser.FilterProvider;
|
||||
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
|
||||
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
|
||||
import tools.jackson.databind.ser.FilterProvider;
|
||||
import tools.jackson.databind.ser.std.SimpleBeanPropertyFilter;
|
||||
import tools.jackson.databind.ser.std.SimpleFilterProvider;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.core.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.constant.CacheConstants;
|
||||
import com.core.common.core.domain.entity.SysDictData;
|
||||
import com.core.common.core.redis.RedisCache;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package com.core.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import tools.jackson.core.JacksonException;
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.DeserializationFeature;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.SerializationFeature;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
/**
|
||||
* Jackson JSON 工具类
|
||||
@@ -13,12 +14,10 @@ import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
* @author system
|
||||
*/
|
||||
public class JsonUtils {
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
static {
|
||||
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
|
||||
}
|
||||
private static final ObjectMapper MAPPER = JsonMapper.builder()
|
||||
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
|
||||
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
|
||||
.build();
|
||||
|
||||
public static ObjectMapper getMapper() {
|
||||
return MAPPER;
|
||||
@@ -27,7 +26,7 @@ public class JsonUtils {
|
||||
public static String toJson(Object obj) {
|
||||
try {
|
||||
return MAPPER.writeValueAsString(obj);
|
||||
} catch (JsonProcessingException e) {
|
||||
} catch (JacksonException e) {
|
||||
return "{}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.core.common.utils.ip;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import com.core.common.config.CoreConfig;
|
||||
import com.core.common.constant.Constants;
|
||||
import com.core.common.utils.StringUtils;
|
||||
|
||||
Reference in New Issue
Block a user