From 72332d53d402339243bed5a2ed691d28362e7de4 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Sat, 23 May 2026 13:05:12 +0800 Subject: [PATCH] feat: com.fasterxml.jackson => tools.jackson --- yudao-dependencies/pom.xml | 2 +- yudao-framework/yudao-common/pom.xml | 9 +-- .../framework/common/util/json/JsonUtils.java | 57 ++++++++++--------- .../util/json/databind/NumberSerializer.java | 36 +++++++++--- .../TimestampLocalDateTimeDeserializer.java | 12 ++-- .../TimestampLocalDateTimeSerializer.java | 20 ++++--- .../config/YudaoTenantAutoConfiguration.java | 11 +--- .../TenantKafkaEnvironmentPostProcessor.java | 2 +- .../main/resources/META-INF/spring.factories | 2 +- .../YudaoRabbitMQAutoConfiguration.java | 6 +- .../IdTypeEnvironmentPostProcessor.java | 2 +- .../config/YudaoMybatisAutoConfiguration.java | 10 ++-- .../main/resources/META-INF/spring.factories | 2 +- .../yudao-spring-boot-starter-redis/pom.xml | 4 +- .../config/YudaoRedisAutoConfiguration.java | 15 ++--- .../YudaoWebSecurityConfigurerAdapter.java | 10 +--- .../test/core/ut/BaseDbAndRedisUnitTest.java | 4 +- .../test/core/ut/BaseRedisUnitTest.java | 4 +- .../yudao-spring-boot-starter-web/pom.xml | 2 +- .../core/filter/ApiAccessLogFilter.java | 2 +- .../core/base/annotation/DesensitizeBy.java | 2 +- .../StringDesensitizeSerializer.java | 21 ++++--- .../config/YudaoJacksonAutoConfiguration.java | 37 +++++------- .../core/handler/GlobalExceptionHandler.java | 2 +- .../xss/config/YudaoXssAutoConfiguration.java | 14 ++--- .../core/json/XssStringJsonDeserializer.java | 13 ++--- .../core/util/BpmHttpRequestUtils.java | 2 +- .../trigger/form/BpmFormDeleteTrigger.java | 2 +- .../trigger/form/BpmFormUpdateTrigger.java | 2 +- .../dal/dataobject/file/FileConfigDO.java | 2 +- .../SeckillConfigServiceImplTest.java | 6 +- .../dto/kd100/Kd100ExpressQueryRespDTO.java | 4 +- .../dto/kdniao/KdNiaoExpressQueryRespDTO.java | 4 +- .../dal/dataobject/channel/PayChannelDO.java | 2 +- 34 files changed, 158 insertions(+), 167 deletions(-) diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index aec0505e66..5cf35c8adf 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -142,7 +142,7 @@ org.springframework.boot - spring-boot-jackson2 + spring-boot-jackson ${spring.boot.version} diff --git a/yudao-framework/yudao-common/pom.xml b/yudao-framework/yudao-common/pom.xml index 4ede9eff2d..6677a4785e 100644 --- a/yudao-framework/yudao-common/pom.xml +++ b/yudao-framework/yudao-common/pom.xml @@ -96,20 +96,15 @@ - com.fasterxml.jackson.core + tools.jackson.core jackson-databind provided - com.fasterxml.jackson.core + tools.jackson.core jackson-core provided - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - provided - org.slf4j diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java index ec136800f2..60b45b8621 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java @@ -6,18 +6,18 @@ import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import com.fasterxml.jackson.annotation.JsonInclude; -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 com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.Getter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +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; +import tools.jackson.databind.module.SimpleModule; -import java.io.IOException; import java.lang.reflect.Type; import java.time.LocalDateTime; import java.util.ArrayList; @@ -32,17 +32,18 @@ import java.util.List; public class JsonUtils { @Getter - private static ObjectMapper objectMapper = new ObjectMapper(); + private static ObjectMapper objectMapper = buildObjectMapper(); - static { - objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 值 - // 解决 LocalDateTime 的序列化 - SimpleModule simpleModule = new JavaTimeModule() + private static ObjectMapper buildObjectMapper() { + SimpleModule simpleModule = new SimpleModule() .addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) .addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); - objectMapper.registerModules(simpleModule); + return JsonMapper.builder() + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .changeDefaultPropertyInclusion(value -> JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .addModule(simpleModule) + .build(); } /** @@ -77,7 +78,7 @@ public class JsonUtils { } try { return objectMapper.readValue(text, clazz); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -91,7 +92,7 @@ public class JsonUtils { JsonNode treeNode = objectMapper.readTree(text); JsonNode pathNode = treeNode.path(path); return objectMapper.readValue(pathNode.toString(), clazz); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -103,7 +104,7 @@ public class JsonUtils { } try { return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -115,7 +116,7 @@ public class JsonUtils { } try { return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -143,7 +144,7 @@ public class JsonUtils { } try { return objectMapper.readValue(bytes, clazz); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", bytes, e); throw new RuntimeException(e); } @@ -152,7 +153,7 @@ public class JsonUtils { public static T parseObject(String text, TypeReference typeReference) { try { return objectMapper.readValue(text, typeReference); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -168,7 +169,7 @@ public class JsonUtils { public static T parseObjectQuietly(String text, TypeReference typeReference) { try { return objectMapper.readValue(text, typeReference); - } catch (IOException e) { + } catch (JacksonException e) { return null; } } @@ -186,7 +187,7 @@ public class JsonUtils { } try { return objectMapper.readValue(text, clazz); - } catch (IOException e) { + } catch (JacksonException e) { return null; } } @@ -197,7 +198,7 @@ public class JsonUtils { } try { return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -211,7 +212,7 @@ public class JsonUtils { JsonNode treeNode = objectMapper.readTree(text); JsonNode pathNode = treeNode.path(path); return objectMapper.readValue(pathNode.toString(), objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -220,7 +221,7 @@ public class JsonUtils { public static JsonNode parseTree(String text) { try { return objectMapper.readTree(text); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } @@ -229,7 +230,7 @@ public class JsonUtils { public static JsonNode parseTree(byte[] text) { try { return objectMapper.readTree(text); - } catch (IOException e) { + } catch (JacksonException e) { log.error("json parse err,json:{}", text, e); throw new RuntimeException(e); } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/NumberSerializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/NumberSerializer.java index 35fc9f72cc..c2898ea6b3 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/NumberSerializer.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/NumberSerializer.java @@ -1,10 +1,13 @@ package cn.iocoder.yudao.framework.common.util.json.databind; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.annotation.JacksonStdImpl; +import tools.jackson.databind.ser.std.StdScalarSerializer; -import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * Long 序列化规则 @@ -14,24 +17,41 @@ import java.io.IOException; * @author 星语 */ @JacksonStdImpl -public class NumberSerializer extends com.fasterxml.jackson.databind.ser.std.NumberSerializer { +public class NumberSerializer extends StdScalarSerializer { private static final long MAX_SAFE_INTEGER = 9007199254740991L; private static final long MIN_SAFE_INTEGER = -9007199254740991L; public static final NumberSerializer INSTANCE = new NumberSerializer(Number.class); + @SuppressWarnings("unchecked") public NumberSerializer(Class rawType) { - super(rawType); + super((Class) rawType); } @Override - public void serialize(Number value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + public void serialize(Number value, JsonGenerator gen, SerializationContext serializers) throws JacksonException { // 超出范围 序列化位字符串 if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { - super.serialize(value, gen, serializers); + writeNumber(value, gen); } else { gen.writeString(value.toString()); } } + + private static void writeNumber(Number value, JsonGenerator gen) throws JacksonException { + if (value instanceof BigDecimal decimal) { + gen.writeNumber(decimal); + } else if (value instanceof BigInteger integer) { + gen.writeNumber(integer); + } else if (value instanceof Double doubleValue) { + gen.writeNumber(doubleValue); + } else if (value instanceof Float floatValue) { + gen.writeNumber(floatValue); + } else if (value instanceof Long longValue) { + gen.writeNumber(longValue); + } else { + gen.writeNumber(value.intValue()); + } + } } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java index 5bf5d6c633..6dfecb7c3c 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.framework.common.util.json.databind; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; -import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -14,12 +14,12 @@ import java.time.ZoneId; * * @author 老五 */ -public class TimestampLocalDateTimeDeserializer extends JsonDeserializer { +public class TimestampLocalDateTimeDeserializer extends ValueDeserializer { public static final TimestampLocalDateTimeDeserializer INSTANCE = new TimestampLocalDateTimeDeserializer(); @Override - public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { // 将 Long 时间戳,转换为 LocalDateTime 对象 return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault()); } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java index 4e422feefd..fc49e805ea 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java @@ -5,12 +5,12 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; import lombok.extern.slf4j.Slf4j; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ser.std.StdScalarSerializer; -import java.io.IOException; import java.lang.reflect.Field; import java.time.LocalDateTime; import java.time.ZoneId; @@ -25,18 +25,22 @@ import java.util.concurrent.ConcurrentHashMap; * @author 老五 */ @Slf4j -public class TimestampLocalDateTimeSerializer extends JsonSerializer { +public class TimestampLocalDateTimeSerializer extends StdScalarSerializer { public static final TimestampLocalDateTimeSerializer INSTANCE = new TimestampLocalDateTimeSerializer(); private static final Map, Map> FIELD_CACHE = new ConcurrentHashMap<>(); + public TimestampLocalDateTimeSerializer() { + super(LocalDateTime.class); + } + @Override - public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + public void serialize(LocalDateTime value, JsonGenerator gen, SerializationContext serializers) throws JacksonException { // 情况一:有 JsonFormat 自定义注解,则使用它。https://github.com/YunaiV/ruoyi-vue-pro/pull/1019 - String fieldName = gen.getOutputContext().getCurrentName(); + String fieldName = gen.streamWriteContext().currentName(); if (fieldName != null) { - Object currentValue = gen.getOutputContext().getCurrentValue(); + Object currentValue = gen.currentValue(); if (currentValue != null) { Class clazz = currentValue.getClass(); Map fieldMap = FIELD_CACHE.computeIfAbsent(clazz, this::buildFieldMap); diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java index b79e09203d..fa252c475e 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java @@ -42,12 +42,9 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.util.pattern.PathPattern; import java.util.*; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; - @AutoConfiguration @ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true) // 允许使用 yudao.tenant.enable=false 禁用多租户 @EnableConfigurationProperties(TenantProperties.class) @@ -142,13 +139,7 @@ public class YudaoTenantAutoConfiguration { continue; } // 添加到忽略的 URL 中 - if (entry.getKey().getPatternsCondition() != null) { - ignoreUrls.addAll(entry.getKey().getPatternsCondition().getPatterns()); - } - if (entry.getKey().getPathPatternsCondition() != null) { - ignoreUrls.addAll( - convertList(entry.getKey().getPathPatternsCondition().getPatterns(), PathPattern::getPatternString)); - } + ignoreUrls.addAll(entry.getKey().getPatternValues()); } return ignoreUrls; } diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java index 8bf7cc1a8d..55f982db2c 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.framework.tenant.core.mq.kafka; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.EnvironmentPostProcessor; import org.springframework.boot.SpringApplication; -import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; /** diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories index a495842a0a..560a541703 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories +++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ -org.springframework.boot.env.EnvironmentPostProcessor=\ +org.springframework.boot.EnvironmentPostProcessor=\ cn.iocoder.yudao.framework.tenant.core.mq.kafka.TenantKafkaEnvironmentPostProcessor diff --git a/yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/rabbitmq/config/YudaoRabbitMQAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/rabbitmq/config/YudaoRabbitMQAutoConfiguration.java index af14673764..4d6dd19442 100644 --- a/yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/rabbitmq/config/YudaoRabbitMQAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/rabbitmq/config/YudaoRabbitMQAutoConfiguration.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.mq.rabbitmq.config; import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.JacksonJsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -18,11 +18,11 @@ import org.springframework.context.annotation.Bean; public class YudaoRabbitMQAutoConfiguration { /** - * Jackson2JsonMessageConverter Bean:使用 jackson 序列化消息 + * JacksonJsonMessageConverter Bean:使用 jackson 序列化消息 */ @Bean public MessageConverter createMessageConverter() { - return new Jackson2JsonMessageConverter(); + return new JacksonJsonMessageConverter(); } } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java index 0ea6bf2522..cf1797a7f4 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java @@ -6,8 +6,8 @@ import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.EnvironmentPostProcessor; import org.springframework.boot.SpringApplication; -import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index 775447a060..990f86ba18 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -9,13 +9,12 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.baomidou.mybatisplus.core.handlers.IJsonTypeHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.baomidou.mybatisplus.extension.handlers.Jackson3TypeHandler; import com.baomidou.mybatisplus.extension.incrementer.*; import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -25,6 +24,7 @@ import org.springframework.core.env.ConfigurableEnvironment; import java.util.List; import java.util.concurrent.TimeUnit; +import tools.jackson.databind.ObjectMapper; /** * MyBaits 配置类 @@ -83,13 +83,13 @@ public class YudaoMybatisAutoConfiguration { @Bean // 特殊:返回结果使用 Object 而不用 JacksonTypeHandler 的原因,避免因为 JacksonTypeHandler 被 mybatis 全局使用! public Object jacksonTypeHandler(List objectMappers) { - // 特殊:设置 JacksonTypeHandler 的 ObjectMapper! + // 特殊:设置 Jackson3TypeHandler 的 ObjectMapper! ObjectMapper objectMapper = CollUtil.getFirst(objectMappers); if (objectMapper == null) { objectMapper = JsonUtils.getObjectMapper(); } - JacksonTypeHandler.setObjectMapper(objectMapper); - return new JacksonTypeHandler(Object.class); + Jackson3TypeHandler.setObjectMapper(objectMapper); + return new Jackson3TypeHandler(Object.class); } } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories index eb172e4ce7..ff83b2a62b 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ -org.springframework.boot.env.EnvironmentPostProcessor=\ +org.springframework.boot.EnvironmentPostProcessor=\ cn.iocoder.yudao.framework.mybatis.config.IdTypeEnvironmentPostProcessor diff --git a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml index 8f4e580a05..d611502210 100644 --- a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml @@ -33,8 +33,8 @@ - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + org.springframework.boot + spring-boot-jackson diff --git a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java index 705a83bd93..a7ff90d0c8 100644 --- a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java @@ -1,18 +1,18 @@ package cn.iocoder.yudao.framework.redis.config; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import org.redisson.spring.starter.RedissonAutoConfigurationV2; +import org.redisson.spring.starter.RedissonAutoConfigurationV4; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.GenericJacksonJsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; /** * Redis 配置类 */ -@AutoConfiguration(before = RedissonAutoConfigurationV2.class) // 目的:使用自己定义的 RedisTemplate Bean +@AutoConfiguration(before = RedissonAutoConfigurationV4.class) // 目的:使用自己定义的 RedisTemplate Bean public class YudaoRedisAutoConfiguration { /** @@ -27,14 +27,15 @@ public class YudaoRedisAutoConfiguration { // 使用 String 序列化方式,序列化 KEY 。 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); - // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 - template.setValueSerializer(buildRedisSerializer()); - template.setHashValueSerializer(buildRedisSerializer()); + // 使用 JSON 序列化方式,序列化 VALUE + RedisSerializer redisSerializer = buildRedisSerializer(); + template.setValueSerializer(redisSerializer); + template.setHashValueSerializer(redisSerializer); return template; } public static RedisSerializer buildRedisSerializer() { - return new GenericJackson2JsonRedisSerializer(JsonUtils.getObjectMapper()); + return new GenericJacksonJsonRedisSerializer(JsonUtils.getObjectMapper()); } } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index 0c7b31521a..26b8624b58 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -29,15 +29,12 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.util.pattern.PathPattern; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; - /** * 自定义的 Spring Security 配置适配器实现 * @@ -170,12 +167,7 @@ public class YudaoWebSecurityConfigurerAdapter { continue; } Set urls = new HashSet<>(); - if (entry.getKey().getPatternsCondition() != null) { - urls.addAll(entry.getKey().getPatternsCondition().getPatterns()); - } - if (entry.getKey().getPathPatternsCondition() != null) { - urls.addAll(convertList(entry.getKey().getPathPatternsCondition().getPatterns(), PathPattern::getPatternString)); - } + urls.addAll(entry.getKey().getPatternValues()); if (urls.isEmpty()) { continue; } diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java index 78fd88205c..acd2bb1065 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; import com.alibaba.druid.spring.boot4.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfigurationV4; import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; import org.springframework.boot.jdbc.autoconfigure.DataSourceTransactionManagerAutoConfiguration; @@ -44,7 +44,7 @@ public class BaseDbAndRedisUnitTest { RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 DataRedisAutoConfiguration.class, // Spring Redis 自动配置类 - RedissonAutoConfiguration.class, // Redisson 自动配置类 + RedissonAutoConfigurationV4.class, // Redisson 自动配置类 // 其它配置类 SpringUtil.class diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java index a730f217cb..a4598232e2 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.test.core.ut; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfigurationV4; import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; @@ -25,7 +25,7 @@ public class BaseRedisUnitTest { RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer DataRedisAutoConfiguration.class, // Spring Redis 自动配置类 YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动配置类 + RedissonAutoConfigurationV4.class, // Redisson 自动配置类 // 其它配置类 SpringUtil.class diff --git a/yudao-framework/yudao-spring-boot-starter-web/pom.xml b/yudao-framework/yudao-spring-boot-starter-web/pom.xml index 7415f61a86..3dbfb5fb71 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-web/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot - spring-boot-jackson2 + spring-boot-jackson org.springframework.boot diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java index 309e174fb4..00a418e453 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -19,7 +19,6 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.web.config.WebProperties; import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; -import com.fasterxml.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.FilterChain; @@ -29,6 +28,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.method.HandlerMethod; +import tools.jackson.databind.JsonNode; import java.io.IOException; import java.time.LocalDateTime; diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/DesensitizeBy.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/DesensitizeBy.java index 0166cb6ef2..c4bcd0dc40 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/DesensitizeBy.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/DesensitizeBy.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.desensitize.core.base.annotation; import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; import cn.iocoder.yudao.framework.desensitize.core.base.serializer.StringDesensitizeSerializer; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java index 566b0d176a..9873366063 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java @@ -7,16 +7,15 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy; import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.BeanProperty; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ContextualSerializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; import lombok.Getter; import lombok.Setter; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.BeanProperty; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; +import tools.jackson.databind.ser.std.StdSerializer; -import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Field; @@ -28,7 +27,7 @@ import java.lang.reflect.Field; * @author gaibu */ @SuppressWarnings("rawtypes") -public class StringDesensitizeSerializer extends StdSerializer implements ContextualSerializer { +public class StringDesensitizeSerializer extends StdSerializer { @Getter @Setter @@ -39,7 +38,7 @@ public class StringDesensitizeSerializer extends StdSerializer implement } @Override - public JsonSerializer createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) { + public ValueSerializer createContextual(SerializationContext serializerProvider, BeanProperty beanProperty) { DesensitizeBy annotation = beanProperty.getAnnotation(DesensitizeBy.class); if (annotation == null) { return this; @@ -52,7 +51,7 @@ public class StringDesensitizeSerializer extends StdSerializer implement @Override @SuppressWarnings("unchecked") - public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { + public void serialize(String value, JsonGenerator gen, SerializationContext serializerProvider) throws JacksonException { if (StrUtil.isBlank(value)) { gen.writeNull(); return; @@ -83,7 +82,7 @@ public class StringDesensitizeSerializer extends StdSerializer implement * @return 字段 */ private Field getField(JsonGenerator generator) { - String currentName = generator.getOutputContext().getCurrentName(); + String currentName = generator.streamWriteContext().currentName(); Object currentValue = generator.currentValue(); Class currentValueClass = currentValue.getClass(); return ReflectUtil.getField(currentValueClass, currentName); diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java index cc4c3af0e7..3225d4d68b 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java @@ -4,24 +4,24 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.json.databind.NumberSerializer; import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.jackson2.autoconfigure.Jackson2AutoConfiguration; -import org.springframework.boot.jackson2.autoconfigure.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; +import tools.jackson.databind.JacksonModule; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ext.javatime.deser.LocalDateDeserializer; +import tools.jackson.databind.ext.javatime.deser.LocalTimeDeserializer; +import tools.jackson.databind.ext.javatime.ser.LocalDateSerializer; +import tools.jackson.databind.ext.javatime.ser.LocalTimeSerializer; +import tools.jackson.databind.module.SimpleModule; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -@AutoConfiguration(after = Jackson2AutoConfiguration.class) +@AutoConfiguration(after = JacksonAutoConfiguration.class) @Slf4j public class YudaoJacksonAutoConfiguration { @@ -29,26 +29,15 @@ public class YudaoJacksonAutoConfiguration { * 从 Builder 源头定制(关键:使用 *ByType,避免 handledType 要求) */ @Bean - public Jackson2ObjectMapperBuilderCustomizer ldtEpochMillisCustomizer() { - return builder -> builder - // Long -> Number - .serializerByType(Long.class, NumberSerializer.INSTANCE) - .serializerByType(Long.TYPE, NumberSerializer.INSTANCE) - // LocalDate / LocalTime - .serializerByType(LocalDate.class, LocalDateSerializer.INSTANCE) - .deserializerByType(LocalDate.class, LocalDateDeserializer.INSTANCE) - .serializerByType(LocalTime.class, LocalTimeSerializer.INSTANCE) - .deserializerByType(LocalTime.class, LocalTimeDeserializer.INSTANCE) - // LocalDateTime < - > EpochMillis - .serializerByType(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) - .deserializerByType(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); + public JsonMapperBuilderCustomizer ldtEpochMillisCustomizer(JacksonModule timestampSupportModuleBean) { + return builder -> builder.addModule(timestampSupportModuleBean); } /** * 以 Bean 形式暴露 Module(Boot 会自动注册到所有 ObjectMapper) */ @Bean - public Module timestampSupportModuleBean() { + public JacksonModule timestampSupportModuleBean() { SimpleModule m = new SimpleModule("TimestampSupportModule"); // Long -> Number,避免前端精度丢失 m.addSerializer(Long.class, NumberSerializer.INSTANCE); diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java index 00c5466c54..97a63a2dc9 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java @@ -15,7 +15,6 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; -import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.google.common.util.concurrent.UncheckedExecutionException; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.ConstraintViolation; @@ -39,6 +38,7 @@ import org.springframework.web.method.annotation.MethodArgumentTypeMismatchExcep import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.resource.NoResourceFoundException; +import tools.jackson.databind.exc.InvalidFormatException; import java.time.LocalDateTime; import java.util.List; diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java index c22ff9c51e..4a983e11ed 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java @@ -9,7 +9,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.jackson2.autoconfigure.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -37,17 +37,17 @@ public class YudaoXssAutoConfiguration implements WebMvcConfigurer { /** * 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤 * - * @return Jackson2ObjectMapperBuilderCustomizer + * @return JsonMapperBuilderCustomizer */ @Bean @ConditionalOnMissingBean(name = "xssJacksonCustomizer") @ConditionalOnProperty(value = "yudao.xss.enable", havingValue = "true") - public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties, - PathMatcher pathMatcher, - XssCleaner xssCleaner) { + public JsonMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties, + PathMatcher pathMatcher, + XssCleaner xssCleaner) { // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理 - return builder -> - builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner)); + return builder -> builder.addModule(new tools.jackson.databind.module.SimpleModule("XssStringModule") + .addDeserializer(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner))); } /** diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java index 047b19d38c..b4b675d93d 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java @@ -3,16 +3,15 @@ package cn.iocoder.yudao.framework.xss.core.json; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.xss.config.XssProperties; import cn.iocoder.yudao.framework.xss.core.clean.XssCleaner; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StringDeserializer; import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.util.PathMatcher; - -import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.jdk.StringDeserializer; /** * XSS 过滤 jackson 反序列化器。 @@ -36,7 +35,7 @@ public class XssStringJsonDeserializer extends StringDeserializer { private final XssCleaner xssCleaner; @Override - public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + public String deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { // 1. 白名单 URL 的处理 HttpServletRequest request = ServletUtils.getRequest(); if (request != null) { diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java index 358ee9f4dc..285a49fc65 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmHttpRequestParamTypeEnum; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import com.fasterxml.jackson.core.type.TypeReference; +import tools.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.http.*; diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java index c441c5f9b6..4b81cda3eb 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.trigger.BpmTrigger; -import com.fasterxml.jackson.core.type.TypeReference; +import tools.jackson.core.type.TypeReference; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java index 4940d697d4..d6c4c0e97a 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.trigger.BpmTrigger; -import com.fasterxml.jackson.core.type.TypeReference; +import tools.jackson.core.type.TypeReference; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileConfigDO.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileConfigDO.java index 4387983a0d..cfede94a3f 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileConfigDO.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileConfigDO.java @@ -15,8 +15,8 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import com.fasterxml.jackson.core.type.TypeReference; import lombok.*; +import tools.jackson.core.type.TypeReference; import java.lang.reflect.Field; diff --git a/yudao-module-mall/yudao-module-promotion/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java b/yudao-module-mall/yudao-module-promotion/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java index 3b422b5c39..5e2c5238a6 100644 --- a/yudao-module-mall/yudao-module-promotion/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java +++ b/yudao-module-mall/yudao-module-promotion/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java @@ -6,11 +6,11 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.Seck import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper; import cn.iocoder.yudao.module.promotion.service.seckill.SeckillConfigServiceImpl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; @@ -50,7 +50,7 @@ public class SeckillConfigServiceImplTest extends BaseDbUnitTest { try { String string = objectMapper.writeValueAsString(reqVO); System.out.println(string); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); } diff --git a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java index d5442cbeeb..51ce9cd72e 100644 --- a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java +++ b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import lombok.Data; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.ext.javatime.deser.LocalDateTimeDeserializer; import java.time.LocalDateTime; import java.util.List; diff --git a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java index 04a7c1431e..0470e81f83 100644 --- a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java +++ b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import lombok.Data; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.ext.javatime.deser.LocalDateTimeDeserializer; import java.time.LocalDateTime; import java.util.List; diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/channel/PayChannelDO.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/channel/PayChannelDO.java index 00397863ce..9a74d02ab2 100644 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/channel/PayChannelDO.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/channel/PayChannelDO.java @@ -16,7 +16,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import com.fasterxml.jackson.core.type.TypeReference; +import tools.jackson.core.type.TypeReference; import lombok.*; import java.lang.reflect.Field;