From 2f4e89ee42d8dbdabdb995449238c51d5b9f2294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 6 Jan 2026 17:18:08 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=B8=8D=E5=85=BC=E5=AE=B9=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E5=8D=87=E7=BA=A7=20springboot=204.X=20update=20sprin?= =?UTF-8?q?gboot=203.5=20=3D>=204.0=20update=20springdoc=202.8=20=3D>=203.?= =?UTF-8?q?0=20update=20mybatis-plus=203.5.14=20=3D>=203.5.15=20update=20r?= =?UTF-8?q?edisson=203.52.0=20=3D>=204.1.0=20update=20dynamic-ds=204.3.1?= =?UTF-8?q?=20=3D>=204.5.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - pom.xml | 16 +- .../src/main/resources/application.yml | 19 +-- ruoyi-common/ruoyi-common-core/pom.xml | 2 +- .../common/core/config/ValidatorConfig.java | 2 +- .../common/core/utils/SpringUtils.java | 2 +- ruoyi-common/ruoyi-common-doc/pom.xml | 5 + .../common/doc/config/SpringDocConfig.java | 2 +- ruoyi-common/ruoyi-common-encrypt/pom.xml | 2 +- ruoyi-common/ruoyi-common-json/pom.xml | 10 +- .../common/json/config/JacksonConfig.java | 37 +++-- .../json/handler/BigNumberSerializer.java | 12 +- .../json/handler/CustomDateDeserializer.java | 12 +- .../dromara/common/json/utils/JsonUtils.java | 68 ++------ ruoyi-common/ruoyi-common-mybatis/pom.xml | 4 +- ruoyi-common/ruoyi-common-redis/pom.xml | 6 + .../common/redis/config/RedisConfig.java | 9 +- .../redis/handler/KeyPrefixHandler.java | 2 +- .../redis/manager/PlusSpringCacheManager.java | 4 + .../sensitive/annotation/Sensitive.java | 3 +- .../sensitive/handler/SensitiveHandler.java | 22 ++- .../sms/config/SmsAutoConfiguration.java | 4 +- .../common/tenant/config/TenantConfig.java | 19 +-- .../translation/annotation/Translation.java | 4 +- .../translation/config/TranslationConfig.java | 24 +-- .../TranslationBeanSerializerModifier.java | 14 +- .../core/handler/TranslationHandler.java | 28 ++-- ruoyi-common/ruoyi-common-web/pom.xml | 2 +- .../dromara/common/web/config/I18nConfig.java | 2 +- .../common/web/config/UndertowConfig.java | 126 +++++++-------- .../web/handler/GlobalExceptionHandler.java | 2 +- .../PlusWebInvokeTimeInterceptor.java | 16 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 - ruoyi-extend/ruoyi-monitor-admin/pom.xml | 2 +- .../common/register/ServerRegister.java | 146 ------------------ 35 files changed, 215 insertions(+), 415 deletions(-) delete mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java diff --git a/README.md b/README.md index 457f0a0b5..8786e423e 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey
CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
数舵科技 软件定制开发APP小程序等 - http://www.shuduokeji.com/
引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc
-**启山商城系统 多租户商城源码可免费商用可二次开发 - https://www.73app.cn/**
Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11
aizuda flowlong 工作流 - https://gitee.com/aizuda/flowlong
Ruoyi-Plus-Uniapp - https://ruoyi.plus
diff --git a/pom.xml b/pom.xml index 0c175fda9..4f2878131 100644 --- a/pom.xml +++ b/pom.xml @@ -14,23 +14,23 @@ 5.5.2 - 3.5.9 + 4.0.1 UTF-8 UTF-8 17 3.5.16 - 2.8.14 + 3.0.1 0.15.0 1.3.0 2.3 1.44.0 - 3.5.14 + 3.5.15 3.9.1 5.8.40 - 3.5.5 - 3.52.0 + 3.5.6 + 4.1.0 2.2.7 - 4.3.1 + 4.5.0 1.9.0 1.5.0 0.2.0 @@ -185,7 +185,7 @@ com.baomidou - dynamic-datasource-spring-boot3-starter + dynamic-datasource-spring-boot4-starter ${dynamic-ds.version} @@ -197,7 +197,7 @@ com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter ${mybatis-plus.version} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 866b8f1a2..c90883ef8 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -5,20 +5,15 @@ server: servlet: # 应用的访问路径 context-path: / - # undertow 配置 - undertow: + # jetty 配置 + jetty: # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的 - max-http-post-size: -1 - # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 - # 每块buffer的空间大小,越小的空间被利用越充分 - buffer-size: 512 - # 是否分配的直接内存 - direct-buffers: true + max-http-form-post-size: -1 threads: - # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 - io: 8 - # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 - worker: 256 + # 最小线程数 + min: 8 + # 最大线程数 + max: 256 captcha: # 是否启用验证码校验 diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index ad37e90db..bac27af57 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -36,7 +36,7 @@ org.springframework.boot - spring-boot-starter-aop + spring-boot-starter-aspectj diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java index ddcd836e4..3c8e60780 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java @@ -3,7 +3,7 @@ package org.dromara.common.core.config; import jakarta.validation.Validator; import org.hibernate.validator.HibernateValidator; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; +import org.springframework.boot.validation.autoconfigure.ValidationAutoConfiguration; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java index 169c6e217..4f53f2592 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -2,7 +2,7 @@ package org.dromara.common.core.utils; import cn.hutool.extra.spring.SpringUtil; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.boot.autoconfigure.thread.Threading; +import org.springframework.boot.thread.Threading; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; diff --git a/ruoyi-common/ruoyi-common-doc/pom.xml b/ruoyi-common/ruoyi-common-doc/pom.xml index c6199a17c..06027ead8 100644 --- a/ruoyi-common/ruoyi-common-doc/pom.xml +++ b/ruoyi-common/ruoyi-common-doc/pom.xml @@ -21,6 +21,11 @@ ruoyi-common-core + + org.springframework.boot + spring-boot-web-server + + org.springdoc springdoc-openapi-starter-webmvc-api diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java index 35b6ce9ea..f53cb5c47 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java @@ -20,8 +20,8 @@ import org.springdoc.core.utils.PropertyResolverUtils; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.server.autoconfigure.ServerProperties; import org.springframework.context.annotation.Bean; import java.util.ArrayList; diff --git a/ruoyi-common/ruoyi-common-encrypt/pom.xml b/ruoyi-common/ruoyi-common-encrypt/pom.xml index ed4910ef0..0e82c1149 100644 --- a/ruoyi-common/ruoyi-common-encrypt/pom.xml +++ b/ruoyi-common/ruoyi-common-encrypt/pom.xml @@ -39,7 +39,7 @@ com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter true diff --git a/ruoyi-common/ruoyi-common-json/pom.xml b/ruoyi-common/ruoyi-common-json/pom.xml index 870df5cdc..c6469b3d1 100644 --- a/ruoyi-common/ruoyi-common-json/pom.xml +++ b/ruoyi-common/ruoyi-common-json/pom.xml @@ -21,15 +21,9 @@ ruoyi-common-core - - com.fasterxml.jackson.core - jackson-databind - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + org.springframework.boot + spring-boot-starter-jackson diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index 039257387..a64653615 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -1,17 +1,16 @@ package org.dromara.common.json.config; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; import org.dromara.common.json.handler.BigNumberSerializer; import org.dromara.common.json.handler.CustomDateDeserializer; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; +import tools.jackson.databind.ext.javatime.deser.LocalDateTimeDeserializer; +import tools.jackson.databind.ext.javatime.ser.LocalDateTimeSerializer; +import tools.jackson.databind.module.SimpleModule; +import tools.jackson.databind.ser.std.ToStringSerializer; import java.math.BigDecimal; import java.math.BigInteger; @@ -30,24 +29,24 @@ import java.util.TimeZone; public class JacksonConfig { @Bean - public Module registerJavaTimeModule() { + public SimpleModule registerJavaTimeModule() { // 全局配置序列化返回 JSON 处理 - JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + SimpleModule module = new SimpleModule(); + module.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + module.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + module.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + module.addSerializer(BigDecimal.class, ToStringSerializer.instance); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - javaTimeModule.addDeserializer(Date.class, new CustomDateDeserializer()); - return javaTimeModule; + module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + module.addDeserializer(Date.class, new CustomDateDeserializer()); + return module; } @Bean - public Jackson2ObjectMapperBuilderCustomizer customizer() { + public JsonMapperBuilderCustomizer jsonInitCustomizer() { return builder -> { - builder.timeZone(TimeZone.getDefault()); + builder.defaultTimeZone(TimeZone.getDefault()); log.info("初始化 jackson 配置"); }; } diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java index 8752353c5..e13795a25 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java @@ -1,11 +1,9 @@ package org.dromara.common.json.handler; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; -import com.fasterxml.jackson.databind.ser.std.NumberSerializer; - -import java.io.IOException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.annotation.JacksonStdImpl; +import tools.jackson.databind.ser.jdk.NumberSerializer; /** * 超出 JS 最大最小值 处理 @@ -31,7 +29,7 @@ public class BigNumberSerializer extends NumberSerializer { } @Override - public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + public void serialize(Number value, JsonGenerator gen, SerializationContext provider) { // 超出范围 序列化为字符串 if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { super.serialize(value, gen, provider); diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java index 21c6a6aa6..9a7d96bd2 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java @@ -2,12 +2,11 @@ package org.dromara.common.json.handler; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; import org.dromara.common.core.utils.ObjectUtils; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; -import java.io.IOException; import java.util.Date; /** @@ -15,7 +14,7 @@ import java.util.Date; * * @author AprilWind */ -public class CustomDateDeserializer extends JsonDeserializer { +public class CustomDateDeserializer extends ValueDeserializer { /** * 反序列化逻辑:将字符串转换为 Date 对象 @@ -23,10 +22,9 @@ public class CustomDateDeserializer extends JsonDeserializer { * @param p JSON 解析器,用于获取字符串值 * @param ctxt 上下文环境(可用于获取更多配置) * @return 转换后的 Date 对象,若为空字符串返回 null - * @throws IOException 当字符串格式非法或转换失败时抛出 */ @Override - public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + public Date deserialize(JsonParser p, DeserializationContext ctxt) { DateTime parse = DateUtil.parse(p.getText()); if (ObjectUtils.isNull(parse)) { return null; diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java index 837e15df5..9aa4d3e02 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java @@ -3,32 +3,29 @@ package org.dromara.common.json.utils; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.exc.MismatchedInputException; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; -import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * JSON 工具类 * - * @author 芋道源码 + * @author Lion Li */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class JsonUtils { - private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + private static final JsonMapper JSON_MAPPER = SpringUtils.getBean(JsonMapper.class); - public static ObjectMapper getObjectMapper() { - return OBJECT_MAPPER; + public static JsonMapper getJsonMapper() { + return JSON_MAPPER; } /** @@ -42,11 +39,7 @@ public class JsonUtils { if (ObjectUtil.isNull(object)) { return null; } - try { - return OBJECT_MAPPER.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.writeValueAsString(object); } /** @@ -62,11 +55,7 @@ public class JsonUtils { if (StringUtils.isEmpty(text)) { return null; } - try { - return OBJECT_MAPPER.readValue(text, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(text, clazz); } /** @@ -82,11 +71,7 @@ public class JsonUtils { if (ArrayUtil.isEmpty(bytes)) { return null; } - try { - return OBJECT_MAPPER.readValue(bytes, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(bytes, clazz); } /** @@ -102,11 +87,7 @@ public class JsonUtils { if (StringUtils.isBlank(text)) { return null; } - try { - return OBJECT_MAPPER.readValue(text, typeReference); - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(text, typeReference); } /** @@ -120,14 +101,7 @@ public class JsonUtils { if (StringUtils.isBlank(text)) { return null; } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); - } catch (MismatchedInputException e) { - // 类型不匹配说明不是json - return null; - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(text, JSON_MAPPER.getTypeFactory().constructType(Dict.class)); } /** @@ -141,11 +115,7 @@ public class JsonUtils { if (StringUtils.isBlank(text)) { return null; } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(text, JSON_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); } /** @@ -161,11 +131,7 @@ public class JsonUtils { if (StringUtils.isEmpty(text)) { return new ArrayList<>(); } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); - } catch (IOException e) { - throw new RuntimeException(e); - } + return JSON_MAPPER.readValue(text, JSON_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } /** @@ -179,7 +145,7 @@ public class JsonUtils { return false; } try { - OBJECT_MAPPER.readTree(str); + JSON_MAPPER.readTree(str); return true; } catch (Exception e) { return false; @@ -197,7 +163,7 @@ public class JsonUtils { return false; } try { - JsonNode node = OBJECT_MAPPER.readTree(str); + JsonNode node = JSON_MAPPER.readTree(str); return node.isObject(); } catch (Exception e) { return false; @@ -215,7 +181,7 @@ public class JsonUtils { return false; } try { - JsonNode node = OBJECT_MAPPER.readTree(str); + JsonNode node = JSON_MAPPER.readTree(str); return node.isArray(); } catch (Exception e) { return false; diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml index d79ba284a..340fa9df1 100644 --- a/ruoyi-common/ruoyi-common-mybatis/pom.xml +++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml @@ -29,12 +29,12 @@ com.baomidou - dynamic-datasource-spring-boot3-starter + dynamic-datasource-spring-boot4-starter com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter diff --git a/ruoyi-common/ruoyi-common-redis/pom.xml b/ruoyi-common/ruoyi-common-redis/pom.xml index 576be5e14..12cb577f7 100644 --- a/ruoyi-common/ruoyi-common-redis/pom.xml +++ b/ruoyi-common/ruoyi-common-redis/pom.xml @@ -28,6 +28,12 @@ redisson-spring-boot-starter + + org.redisson + redisson-spring-cache + ${redisson.version} + + com.baomidou lock4j-redisson-spring-boot-starter diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java index 4c39196e8..2e82330f2 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; @@ -47,7 +48,7 @@ public class RedisConfig { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - ObjectMapper om = new ObjectMapper(); + JsonMapper om = new JsonMapper(); om.registerModule(javaTimeModule); om.setTimeZone(TimeZone.getDefault()); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); @@ -64,6 +65,8 @@ public class RedisConfig { .setNettyThreads(redissonProperties.getNettyThreads()) // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现) .setUseScriptCache(true) + //设置redis key前缀 + .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) .setCodec(codec); if (SpringUtils.isVirtual()) { config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); @@ -72,8 +75,6 @@ public class RedisConfig { if (ObjectUtil.isNotNull(singleServerConfig)) { // 使用单机模式 config.useSingleServer() - //设置redis key前缀 - .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) .setTimeout(singleServerConfig.getTimeout()) .setClientName(singleServerConfig.getClientName()) .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) @@ -85,8 +86,6 @@ public class RedisConfig { RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); if (ObjectUtil.isNotNull(clusterServersConfig)) { config.useClusterServers() - //设置redis key前缀 - .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) .setTimeout(clusterServersConfig.getTimeout()) .setClientName(clusterServersConfig.getClientName()) .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java index 3bf3e346a..f34ddc83a 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java @@ -1,7 +1,7 @@ package org.dromara.common.redis.handler; import org.dromara.common.core.utils.StringUtils; -import org.redisson.api.NameMapper; +import org.redisson.config.NameMapper; /** * redis缓存key前缀处理 diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 8428ef725..a1debec2c 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -18,6 +18,7 @@ package org.dromara.common.redis.manager; import org.dromara.common.redis.utils.RedisUtils; import org.redisson.api.RMap; import org.redisson.api.RMapCache; +import org.redisson.api.map.event.MapEntryListener; import org.redisson.spring.cache.CacheConfig; import org.redisson.spring.cache.RedissonCache; import org.springframework.boot.convert.DurationStyle; @@ -189,6 +190,9 @@ public class PlusSpringCacheManager implements CacheManager { cache = oldCache; } else { map.setMaxSize(config.getMaxSize()); + for (MapEntryListener listener : config.getListeners()) { + map.addListener(listener); + } } return cache; } diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java index e75dc5bf2..2506c89b0 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java @@ -1,9 +1,9 @@ package org.dromara.common.sensitive.annotation; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.dromara.common.sensitive.core.SensitiveStrategy; import org.dromara.common.sensitive.handler.SensitiveHandler; +import tools.jackson.databind.annotation.JsonSerialize; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -20,6 +20,7 @@ import java.lang.annotation.Target; @JacksonAnnotationsInside @JsonSerialize(using = SensitiveHandler.class) public @interface Sensitive { + SensitiveStrategy strategy(); /** diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java index d454724d7..76959259e 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java @@ -1,20 +1,18 @@ package org.dromara.common.sensitive.handler; import cn.hutool.core.util.ObjectUtil; -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 lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.sensitive.annotation.Sensitive; import org.dromara.common.sensitive.core.SensitiveService; import org.dromara.common.sensitive.core.SensitiveStrategy; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; +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 java.io.IOException; import java.util.Objects; /** @@ -23,14 +21,14 @@ import java.util.Objects; * @author Yjoioooo */ @Slf4j -public class SensitiveHandler extends JsonSerializer implements ContextualSerializer { +public class SensitiveHandler extends ValueSerializer { private SensitiveStrategy strategy; private String[] roleKey; private String[] perms; @Override - public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + public void serialize(String value, JsonGenerator gen, SerializationContext ctxt) throws JacksonException { try { SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive(roleKey, perms)) { @@ -45,7 +43,7 @@ public class SensitiveHandler extends JsonSerializer implements Contextu } @Override - public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + public ValueSerializer createContextual(SerializationContext ctxt, BeanProperty property) { Sensitive annotation = property.getAnnotation(Sensitive.class); if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { this.strategy = annotation.strategy(); @@ -53,6 +51,6 @@ public class SensitiveHandler extends JsonSerializer implements Contextu this.perms = annotation.perms(); return this; } - return prov.findValueSerializer(property.getType(), property); + return super.createContextual(ctxt, property); } } diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java index 3a39cc216..494ec03b2 100644 --- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java @@ -4,7 +4,7 @@ import org.dromara.common.sms.core.dao.PlusSmsDao; import org.dromara.common.sms.handler.SmsExceptionHandler; import org.dromara.sms4j.api.dao.SmsDao; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; @@ -13,7 +13,7 @@ import org.springframework.context.annotation.Primary; * * @author Feng */ -@AutoConfiguration(after = {RedisAutoConfiguration.class}) +@AutoConfiguration(after = {DataRedisAutoConfiguration.class}) public class SmsAutoConfiguration { @Primary diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 3767fa2f1..ce54fb5e1 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -1,9 +1,7 @@ package org.dromara.common.tenant.config; import cn.dev33.satoken.dao.SaTokenDao; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; -import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.redis.config.RedisConfig; import org.dromara.common.redis.config.properties.RedissonProperties; import org.dromara.common.tenant.core.TenantSaTokenDao; @@ -11,8 +9,6 @@ import org.dromara.common.tenant.handle.PlusTenantLineHandler; import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; import org.dromara.common.tenant.manager.TenantSpringCacheManager; import org.dromara.common.tenant.properties.TenantProperties; -import org.redisson.config.ClusterServersConfig; -import org.redisson.config.SingleServerConfig; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -49,19 +45,8 @@ public class TenantConfig { @Bean public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) { return config -> { - TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix()); - SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig"); - if (ObjectUtil.isNotNull(singleServerConfig)) { - // 使用单机模式 - // 设置多租户 redis key前缀 - singleServerConfig.setNameMapper(nameMapper); - } - ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig"); - // 集群配置方式 参考下方注释 - if (ObjectUtil.isNotNull(clusterServersConfig)) { - // 设置多租户 redis key前缀 - clusterServersConfig.setNameMapper(nameMapper); - } + // 设置多租户 redis key前缀 + config.setNameMapper(new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix())); }; } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java index c24aa6fa0..f24c31c18 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java @@ -1,8 +1,8 @@ package org.dromara.common.translation.annotation; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.dromara.common.translation.core.handler.TranslationHandler; +import tools.jackson.databind.annotation.JsonSerialize; import java.lang.annotation.*; @@ -11,10 +11,8 @@ import java.lang.annotation.*; * * @author Lion Li */ -@Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) -@Documented @JacksonAnnotationsInside @JsonSerialize(using = TranslationHandler.class) public @interface Translation { diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java index 5dcd0c199..d1b52fdf6 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java @@ -1,14 +1,16 @@ package org.dromara.common.translation.config; -import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.core.TranslationInterface; import org.dromara.common.translation.core.handler.TranslationBeanSerializerModifier; import org.dromara.common.translation.core.handler.TranslationHandler; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import tools.jackson.databind.ser.SerializerFactory; import java.util.HashMap; import java.util.List; @@ -26,9 +28,6 @@ public class TranslationConfig { @Autowired private List> list; - @Autowired - private ObjectMapper objectMapper; - @PostConstruct public void init() { Map> map = new HashMap<>(list.size()); @@ -41,10 +40,15 @@ public class TranslationConfig { } } TranslationHandler.TRANSLATION_MAPPER.putAll(map); - // 设置 Bean 序列化修改器 - objectMapper.setSerializerFactory( - objectMapper.getSerializerFactory() - .withSerializerModifier(new TranslationBeanSerializerModifier())); + } + + @Bean + public JsonMapperBuilderCustomizer translationInitCustomizer() { + return builder -> { + SerializerFactory serializerFactory = builder.serializerFactory(); + serializerFactory = serializerFactory.withSerializerModifier(new TranslationBeanSerializerModifier()); + builder.serializerFactory(serializerFactory); + }; } } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java index 727672f25..c815d104d 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java @@ -1,9 +1,9 @@ package org.dromara.common.translation.core.handler; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; -import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.SerializationConfig; +import tools.jackson.databind.ser.BeanPropertyWriter; +import tools.jackson.databind.ser.ValueSerializerModifier; import java.util.List; @@ -12,10 +12,10 @@ import java.util.List; * * @author Lion Li */ -public class TranslationBeanSerializerModifier extends BeanSerializerModifier { +public class TranslationBeanSerializerModifier extends ValueSerializerModifier { @Override - public List changeProperties(SerializationConfig config, BeanDescription beanDesc, + public List changeProperties(SerializationConfig config, BeanDescription.Supplier beanDesc, List beanProperties) { for (BeanPropertyWriter writer : beanProperties) { // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理 @@ -23,7 +23,7 @@ public class TranslationBeanSerializerModifier extends BeanSerializerModifier { writer.assignNullSerializer(serializer); } } - return beanProperties; + return super.changeProperties(config, beanDesc, beanProperties); } } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java index e8c03acdc..a8511055b 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java @@ -1,19 +1,17 @@ package org.dromara.common.translation.core.handler; import cn.hutool.core.util.ObjectUtil; -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 lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.core.TranslationInterface; -import lombok.extern.slf4j.Slf4j; +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 java.io.IOException; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -24,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; * @author Lion Li */ @Slf4j -public class TranslationHandler extends JsonSerializer implements ContextualSerializer { +public class TranslationHandler extends ValueSerializer { /** * 全局翻译实现类映射器 @@ -34,7 +32,7 @@ public class TranslationHandler extends JsonSerializer implements Contex private Translation translation; @Override - public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + public void serialize(Object value, JsonGenerator gen, SerializationContext ctxt) throws JacksonException { TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type()); if (ObjectUtil.isNotNull(trans)) { // 如果映射字段不为空 则取映射字段的值 @@ -48,24 +46,24 @@ public class TranslationHandler extends JsonSerializer implements Contex } try { Object result = trans.translation(value, translation.other()); - gen.writeObject(result); + gen.writePOJO(result); } catch (Exception e) { log.error("翻译处理异常,type: {}, value: {}", translation.type(), value, e); // 出现异常时输出原始值而不是中断序列化 - gen.writeObject(value); + gen.writePOJO(value); } } else { - gen.writeObject(value); + gen.writePOJO(value); } } @Override - public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + public ValueSerializer createContextual(SerializationContext ctxt, BeanProperty property) { Translation translation = property.getAnnotation(Translation.class); if (Objects.nonNull(translation)) { this.translation = translation; return this; } - return prov.findValueSerializer(property.getType(), property); + return super.createContextual(ctxt, property); } } diff --git a/ruoyi-common/ruoyi-common-web/pom.xml b/ruoyi-common/ruoyi-common-web/pom.xml index c687ad589..65965eec0 100644 --- a/ruoyi-common/ruoyi-common-web/pom.xml +++ b/ruoyi-common/ruoyi-common-web/pom.xml @@ -35,7 +35,7 @@ org.springframework.boot - spring-boot-starter-undertow + spring-boot-starter-jetty diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java index 4e212cb73..317479aa7 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java @@ -2,7 +2,7 @@ package org.dromara.common.web.config; import org.dromara.common.web.core.I18nLocaleResolver; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.boot.webmvc.autoconfigure.WebMvcAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.LocaleResolver; diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java index 84f88ff82..8179bea85 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java @@ -1,63 +1,63 @@ -package org.dromara.common.web.config; - -import io.undertow.server.DefaultByteBufferPool; -import io.undertow.server.handlers.DisallowedMethodsHandler; -import io.undertow.util.HttpString; -import io.undertow.websockets.jsr.WebSocketDeploymentInfo; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; -import org.springframework.boot.web.server.WebServerFactoryCustomizer; -import org.springframework.core.task.VirtualThreadTaskExecutor; - -/** - * Undertow 自定义配置 - * - * @author Lion Li - */ -@AutoConfiguration -public class UndertowConfig implements WebServerFactoryCustomizer { - - /** - * 自定义 Undertow 配置 - *

- * 主要配置内容包括: - * 1. 配置 WebSocket 部署信息 - * 2. 在虚拟线程模式下使用虚拟线程池 - * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK - *

- * - * @param factory Undertow 的 Web 服务器工厂 - */ - @Override - public void customize(UndertowServletWebServerFactory factory) { - factory.addDeploymentInfoCustomizers(deploymentInfo -> { - // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池 - WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); - webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024)); - deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); - - // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池 - if (SpringUtils.isVirtual()) { - // 创建虚拟线程池,线程池前缀为 "undertow-" - VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-"); - // 设置虚拟线程池为执行器和异步执行器 - deploymentInfo.setExecutor(executor); - deploymentInfo.setAsyncExecutor(executor); - } - - // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK) - deploymentInfo.addInitialHandlerChainWrapper(handler -> { - // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰 - HttpString[] disallowedHttpMethods = { - HttpString.tryFromString("CONNECT"), - HttpString.tryFromString("TRACE"), - HttpString.tryFromString("TRACK") - }; - // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求 - return new DisallowedMethodsHandler(handler, disallowedHttpMethods); - }); - }); - } - -} +//package org.dromara.common.web.config; +// +//import io.undertow.server.DefaultByteBufferPool; +//import io.undertow.server.handlers.DisallowedMethodsHandler; +//import io.undertow.util.HttpString; +//import io.undertow.websockets.jsr.WebSocketDeploymentInfo; +//import org.dromara.common.core.utils.SpringUtils; +//import org.springframework.boot.autoconfigure.AutoConfiguration; +//import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +//import org.springframework.boot.web.server.WebServerFactoryCustomizer; +//import org.springframework.core.task.VirtualThreadTaskExecutor; +// +///** +// * Undertow 自定义配置 +// * +// * @author Lion Li +// */ +//@AutoConfiguration +//public class UndertowConfig implements WebServerFactoryCustomizer { +// +// /** +// * 自定义 Undertow 配置 +// *

+// * 主要配置内容包括: +// * 1. 配置 WebSocket 部署信息 +// * 2. 在虚拟线程模式下使用虚拟线程池 +// * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK +// *

+// * +// * @param factory Undertow 的 Web 服务器工厂 +// */ +// @Override +// public void customize(UndertowServletWebServerFactory factory) { +// factory.addDeploymentInfoCustomizers(deploymentInfo -> { +// // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池 +// WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); +// webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024)); +// deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); +// +// // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池 +// if (SpringUtils.isVirtual()) { +// // 创建虚拟线程池,线程池前缀为 "undertow-" +// VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-"); +// // 设置虚拟线程池为执行器和异步执行器 +// deploymentInfo.setExecutor(executor); +// deploymentInfo.setAsyncExecutor(executor); +// } +// +// // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK) +// deploymentInfo.addInitialHandlerChainWrapper(handler -> { +// // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰 +// HttpString[] disallowedHttpMethods = { +// HttpString.tryFromString("CONNECT"), +// HttpString.tryFromString("TRACE"), +// HttpString.tryFromString("TRACK") +// }; +// // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求 +// return new DisallowedMethodsHandler(handler, disallowedHttpMethods); +// }); +// }); +// } +// +//} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index 7a5d82c3e..c59f0f2ac 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -2,7 +2,6 @@ package org.dromara.common.web.handler; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; -import com.fasterxml.jackson.core.JsonParseException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.ConstraintViolation; @@ -14,6 +13,7 @@ import org.dromara.common.core.exception.SseException; import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.json.utils.JsonUtils; +import org.springframework.boot.json.JsonParseException; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.expression.ExpressionException; diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java index b56cec1f5..e3f26c8fb 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java @@ -4,10 +4,6 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -19,6 +15,10 @@ import org.dromara.common.web.filter.RepeatedlyRequestWrapper; import org.springframework.http.MediaType; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import java.util.HashSet; import java.util.LinkedHashMap; @@ -45,8 +45,8 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { if (request instanceof RepeatedlyRequestWrapper) { jsonParam = IoUtil.read(request.getReader()); if (StringUtils.isNotBlank(jsonParam)) { - ObjectMapper objectMapper = JsonUtils.getObjectMapper(); - JsonNode rootNode = objectMapper.readTree(jsonParam); + JsonMapper jsonMapper = JsonUtils.getJsonMapper(); + JsonNode rootNode = jsonMapper.readTree(jsonParam); removeSensitiveFields(rootNode, SystemConstants.EXCLUDE_PROPERTIES); jsonParam = rootNode.toString(); } @@ -79,14 +79,14 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { ObjectNode objectNode = (ObjectNode) node; // 收集要删除的字段名(避免 ConcurrentModification) Set fieldsToRemove = new HashSet<>(); - objectNode.fieldNames().forEachRemaining(fieldName -> { + objectNode.propertyNames().forEach(fieldName -> { if (ArrayUtil.contains(excludeProperties, fieldName)) { fieldsToRemove.add(fieldName); } }); fieldsToRemove.forEach(objectNode::remove); // 递归处理子节点 - objectNode.elements().forEachRemaining(child -> removeSensitiveFields(child, excludeProperties)); + objectNode.values().forEach(child -> removeSensitiveFields(child, excludeProperties)); } else if (node.isArray()) { ArrayNode arrayNode = (ArrayNode) node; for (JsonNode child : arrayNode) { diff --git a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fc10a36f7..7299472a0 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -2,4 +2,3 @@ org.dromara.common.web.config.CaptchaConfig org.dromara.common.web.config.FilterConfig org.dromara.common.web.config.I18nConfig org.dromara.common.web.config.ResourcesConfig -org.dromara.common.web.config.UndertowConfig diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 538ffbd9f..66fcb3c60 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -26,7 +26,7 @@ org.springframework.boot - spring-boot-starter-undertow + spring-boot-starter-jetty diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java deleted file mode 100644 index 2a8a47aa4..000000000 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.aizuda.snailjob.server.common.register; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.aizuda.snailjob.common.core.enums.NodeTypeEnum; -import com.aizuda.snailjob.common.core.util.JsonUtil; -import com.aizuda.snailjob.common.core.util.NetUtil; -import com.aizuda.snailjob.common.core.util.SnailJobVersion; -import com.aizuda.snailjob.common.core.util.StreamUtils; -import com.aizuda.snailjob.common.log.SnailJobLog; -import com.aizuda.snailjob.server.common.cache.CacheConsumerGroup; -import com.aizuda.snailjob.server.common.config.SystemProperties; -import com.aizuda.snailjob.server.common.convert.RegisterNodeInfoConverter; -import com.aizuda.snailjob.server.common.dto.ServerNodeExtAttrs; -import com.aizuda.snailjob.server.common.handler.InstanceManager; -import com.aizuda.snailjob.template.datasource.persistence.po.ServerNode; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.google.common.collect.Lists; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * 服务端注册 - * - * @author opensnail - * @date 2023-06-07 - * @since 1.6.0 - */ -@Component(ServerRegister.BEAN_NAME) -@RequiredArgsConstructor -public class ServerRegister extends AbstractRegister { - public static final String BEAN_NAME = "serverRegister"; - private final ScheduledExecutorService serverRegisterNode = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "server-register-node")); - public static final int DELAY_TIME = 30; - public static final String CURRENT_CID; - public static final String GROUP_NAME = "DEFAULT_SERVER"; - public static final String NAMESPACE_ID = "DEFAULT_SERVER_NAMESPACE_ID"; - private final InstanceManager instanceManager; - private final SystemProperties systemProperties; - private final ServerProperties serverProperties; - - static { - CURRENT_CID = IdUtil.getSnowflakeNextIdStr(); - } - - @Override - public boolean supports(int type) { - return getNodeType().equals(type); - } - - @Override - protected void beforeProcessor(RegisterContext context) { - // 新增扩展参数 - ServerNodeExtAttrs serverNodeExtAttrs = new ServerNodeExtAttrs(); - serverNodeExtAttrs.setWebPort(serverProperties.getPort()); - serverNodeExtAttrs.setSystemVersion(SnailJobVersion.getVersion()); - - context.setGroupName(GROUP_NAME); - context.setHostId(CURRENT_CID); - String serverHost = systemProperties.getServerHost(); - if (StrUtil.isEmptyIfStr(serverHost)) { - serverHost = NetUtil.getLocalIpStr(); - } - context.setHostIp(serverHost); - context.setHostPort(systemProperties.getServerPort()); - context.setContextPath(Optional.ofNullable(serverProperties.getServlet().getContextPath()).orElse(StrUtil.EMPTY)); - context.setNamespaceId(NAMESPACE_ID); - context.setExtAttrs(JsonUtil.toJsonString(serverNodeExtAttrs)); - } - - @Override - protected LocalDateTime getExpireAt() { - return LocalDateTime.now().plusSeconds(DELAY_TIME); - } - - @Override - protected boolean doRegister(RegisterContext context, ServerNode serverNode) { - refreshExpireAt(Lists.newArrayList(serverNode)); - return Boolean.TRUE; - } - - - @Override - protected void afterProcessor(final ServerNode serverNode) { - try { - // 同步当前POD消费的组的节点信息 - // netty的client只会注册到一个服务端,若组分配的和client连接的不是一个POD则会导致当前POD没有其他客户端的注册信息 - ConcurrentMap/*namespaceId*/> allConsumerGroupName = CacheConsumerGroup.getAllConsumerGroupName(); - if (CollUtil.isNotEmpty(allConsumerGroupName)) { - Set namespaceIdSets = StreamUtils.toSetByFlatMap(allConsumerGroupName.values(), Set::stream); - if (CollUtil.isEmpty(namespaceIdSets)) { - return; - } - - List serverNodes = serverNodeMapper.selectList( - new LambdaQueryWrapper() - .eq(ServerNode::getNodeType, NodeTypeEnum.CLIENT.getType()) - .in(ServerNode::getNamespaceId, namespaceIdSets) - .in(ServerNode::getGroupName, allConsumerGroupName.keySet())); - for (final ServerNode node : serverNodes) { - // 刷新全量本地缓存 - instanceManager.registerOrUpdate(RegisterNodeInfoConverter.INSTANCE.toRegisterNodeInfo(node)); - // 刷新过期时间 - CacheConsumerGroup.addOrUpdate(node.getGroupName(), node.getNamespaceId()); - } - } - } catch (Exception e) { - SnailJobLog.LOCAL.error("Client refresh failed", e); - } - } - - @Override - protected Integer getNodeType() { - return NodeTypeEnum.SERVER.getType(); - } - - @Override - public void start() { - SnailJobLog.LOCAL.info("ServerRegister start"); - - serverRegisterNode.scheduleAtFixedRate(() -> { - try { - this.register(new RegisterContext()); - } catch (Exception e) { - SnailJobLog.LOCAL.error("Server-side registration failed", e); - } - }, 0, DELAY_TIME * 2 / 3, TimeUnit.SECONDS); - - } - - @Override - public void close() { - SnailJobLog.LOCAL.info("ServerRegister close"); - } -}