diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index f571c8acb..f1d426ae3 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -33,7 +33,6 @@
3.18.0
8.1.2.141
- 2.7.18
1.9.2
@@ -301,21 +300,6 @@
-
- org.apache.dubbo
- dubbo-common
- ${dubbo.version}
-
-
- org.apache.dubbo
- dubbo-cluster
- ${dubbo.version}
-
-
- org.apache.dubbo
- dubbo-rpc-api
- ${dubbo.version}
-
cn.iocoder.cloud
yudao-spring-boot-starter-rpc
diff --git a/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java b/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
index bda196c5c..c300c525e 100644
--- a/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
+++ b/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
@@ -39,6 +39,8 @@ public class BannerApplicationRunner implements ApplicationRunner {
System.out.println("[微信公众号 yudao-module-mp 教程][参考 https://cloud.iocoder.cn/mp/build/ 开启]");
// 商城
System.out.println("[商城系统 yudao-module-mall 教程][参考 https://cloud.iocoder.cn/mall/build/ 开启]");
+ // 支付
+ System.out.println("[支付系统 yudao-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]");
});
}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java
index 8aeb75638..1b3492a76 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java
@@ -227,8 +227,7 @@ public class OperateLogAspect {
private static void fillMethodFields(OperateLog operateLogObj,
ProceedingJoinPoint joinPoint,
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
- LocalDateTime startTime, Object result, Throwable exception) {
- MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+ LocalDateTime startTime, Object result, Throwable exception) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
operateLogObj.setJavaMethod(methodSignature.toString());
if (operateLog == null || operateLog.logArgs()) {
operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint));
@@ -258,6 +257,11 @@ public class OperateLogAspect {
if (operateLog != null) {
return operateLog.enable();
}
+ // Cloud 专属逻辑:如果是 RPC 请求,则必须 @OperateLog 注解,才会记录操作日志
+ String className = joinPoint.getSignature().getDeclaringType().getName();
+ if (WebFrameworkUtils.isRpcRequest(className)) {
+ return false;
+ }
// 没有 @ApiOperation 注解的情况下,只记录 POST、PUT、DELETE 的情况
return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null;
}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImpl.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImpl.java
index 5c57dd009..121aeb087 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImpl.java
@@ -5,6 +5,8 @@ import cn.iocoder.yudao.framework.pay.core.client.PayClient;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.*;
+import cn.iocoder.yudao.framework.pay.core.client.impl.mock.MockPayClient;
+import cn.iocoder.yudao.framework.pay.core.client.impl.mock.MockPayClientConfig;
import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.*;
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
import lombok.extern.slf4j.Slf4j;
@@ -68,6 +70,8 @@ public class PayClientFactoryImpl implements PayClientFactory {
case ALIPAY_APP: return (AbstractPayClient) new AlipayAppPayClient(channelId, (AlipayPayClientConfig) config);
case ALIPAY_PC: return (AbstractPayClient) new AlipayPcPayClient(channelId, (AlipayPayClientConfig) config);
case ALIPAY_BAR: return (AbstractPayClient) new AlipayBarPayClient(channelId, (AlipayPayClientConfig) config);
+ // 其它支付
+ case MOCK: return (AbstractPayClient) new MockPayClient(channelId, (MockPayClientConfig) config);
}
// 创建失败,错误日志 + 抛出异常
log.error("[createPayClient][配置({}) 找不到合适的客户端实现]", config);
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClient.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClient.java
new file mode 100644
index 000000000..1d3f4d48b
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClient.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.framework.pay.core.client.impl.mock;
+
+import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderRespDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundRespDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
+import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
+import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * 模拟支付的 PayClient 实现类
+ *
+ * 模拟支付返回结果都是成功,方便大家日常流畅
+ *
+ * @author jason
+ */
+public class MockPayClient extends AbstractPayClient {
+
+ private static final String MOCK_RESP_SUCCESS_DATA = "MOCK_SUCCESS";
+
+ public MockPayClient(Long channelId, MockPayClientConfig config) {
+ super(channelId, PayChannelEnum.MOCK.getCode(), config);
+ }
+
+ @Override
+ protected void doInit() {
+ }
+
+ @Override
+ protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) {
+ return PayOrderRespDTO.successOf("MOCK-P-" + reqDTO.getOutTradeNo(), "", LocalDateTime.now(),
+ reqDTO.getOutTradeNo(), MOCK_RESP_SUCCESS_DATA);
+ }
+
+ @Override
+ protected PayOrderRespDTO doGetOrder(String outTradeNo) {
+ return PayOrderRespDTO.successOf("MOCK-P-" + outTradeNo, "", LocalDateTime.now(),
+ outTradeNo, MOCK_RESP_SUCCESS_DATA);
+ }
+
+ @Override
+ protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) {
+ return PayRefundRespDTO.successOf("MOCK-R-" + reqDTO.getOutRefundNo(), LocalDateTime.now(),
+ reqDTO.getOutRefundNo(), MOCK_RESP_SUCCESS_DATA);
+ }
+
+ @Override
+ protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) {
+ return PayRefundRespDTO.successOf("MOCK-R-" + outRefundNo, LocalDateTime.now(),
+ outRefundNo, MOCK_RESP_SUCCESS_DATA);
+ }
+
+ @Override
+ protected PayRefundRespDTO doParseRefundNotify(Map params, String body) {
+ throw new UnsupportedOperationException("模拟支付无退款回调");
+ }
+
+ @Override
+ protected PayOrderRespDTO doParseOrderNotify(Map params, String body) {
+ throw new UnsupportedOperationException("模拟支付无支付回调");
+ }
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClientConfig.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClientConfig.java
new file mode 100644
index 000000000..3e35c52dc
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/mock/MockPayClientConfig.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.framework.pay.core.client.impl.mock;
+
+import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
+import lombok.Data;
+
+import javax.validation.Validator;
+
+/**
+ * 模拟支付的 PayClientConfig 实现类
+ *
+ * @author jason
+ */
+@Data
+public class MockPayClientConfig implements PayClientConfig {
+
+ /**
+ * 配置名称
+ *
+ * 如果不加任何属性,JsonUtils.parseObject2 解析会报错,所以暂时加个名称
+ */
+ private String name;
+
+ @Override
+ public void validate(Validator validator) {
+ // 模拟支付配置无需校验
+ }
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/channel/PayChannelEnum.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/channel/PayChannelEnum.java
index 78bb85f1a..073b17f3c 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/channel/PayChannelEnum.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/channel/PayChannelEnum.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.pay.core.enums.channel;
import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
+import cn.iocoder.yudao.framework.pay.core.client.impl.mock.MockPayClientConfig;
import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -26,7 +27,9 @@ public enum PayChannelEnum {
ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付", AlipayPayClientConfig.class),
ALIPAY_APP("alipay_app", "支付宝App 支付", AlipayPayClientConfig.class),
ALIPAY_QR("alipay_qr", "支付宝扫码支付", AlipayPayClientConfig.class),
- ALIPAY_BAR("alipay_bar", "支付宝条码支付", AlipayPayClientConfig.class);
+ ALIPAY_BAR("alipay_bar", "支付宝条码支付", AlipayPayClientConfig.class),
+
+ MOCK("mock", "模拟支付", MockPayClientConfig.class);
/**
* 编码
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefine.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefine.java
deleted file mode 100644
index c78ae44ec..000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefine.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package cn.iocoder.yudao.framework.tenant.core.redis;
-
-import cn.hutool.core.util.ArrayUtil;
-import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
-import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
-
-import java.time.Duration;
-
-/**
- * 多租户拓展的 RedisKeyDefine 实现类
- *
- * 由于 Redis 不同于 MySQL 有 column 字段,无法通过类似 WHERE tenant_id = ? 的方式过滤
- * 所以需要通过在 Redis Key 上增加后缀的方式,进行租户之间的隔离。具体的步骤是:
- * 1. 假设 Redis Key 是 user:%d,示例是 user:1;对应到多租户的 Redis Key 是 user:%d:%d,
- * 2. 在 Redis DAO 中,需要使用 {@link #formatKey(Object...)} 方法,进行 Redis Key 的格式化
- *
- * 注意,大多数情况下,并不用使用 TenantRedisKeyDefine 实现。主要的使用场景,还是 Redis Key 可能存在冲突的情况。
- * 例如说,租户 1 和 2 都有一个手机号作为 Key,则他们会存在冲突的问题
- *
- * @author 芋道源码
- */
-public class TenantRedisKeyDefine extends RedisKeyDefine {
-
- /**
- * 多租户的 KEY 模板
- */
- private static final String KEY_TEMPLATE_SUFFIX = ":%d";
-
- public TenantRedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class> valueType, Duration timeout) {
- super(memo, buildKeyTemplate(keyTemplate), keyType, valueType, timeout);
- }
-
- public TenantRedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class> valueType, TimeoutTypeEnum timeoutType) {
- super(memo, buildKeyTemplate(keyTemplate), keyType, valueType, timeoutType);
- }
-
- private static String buildKeyTemplate(String keyTemplate) {
- return keyTemplate + KEY_TEMPLATE_SUFFIX;
- }
-
- @Override
- public String formatKey(Object... args) {
- args = ArrayUtil.append(args, TenantContextHolder.getRequiredTenantId());
- return super.formatKey(args);
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/test/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefineTest.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/test/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefineTest.java
deleted file mode 100644
index d456e011c..000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/test/java/cn/iocoder/yudao/framework/tenant/core/redis/TenantRedisKeyDefineTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package cn.iocoder.yudao.framework.tenant.core.redis;
-
-import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
-import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class TenantRedisKeyDefineTest {
-
- @Test
- public void testFormatKey() {
- Long tenantId = 30L;
- TenantContextHolder.setTenantId(tenantId);
- // 准备参数
- TenantRedisKeyDefine define = new TenantRedisKeyDefine("", "user:%d:%d", RedisKeyDefine.KeyTypeEnum.HASH,
- Object.class, RedisKeyDefine.TimeoutTypeEnum.FIXED);
- Long userId = 10L;
- Integer userType = 1;
-
- // 调用
- String key = define.formatKey(userId, userType);
- // 断言
- assertEquals("user:10:1:30", key);
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
index 057445519..21f19efe6 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
@@ -1,7 +1,5 @@
package cn.iocoder.yudao.framework.captcha.config;
-import cn.hutool.core.util.ClassUtil;
-import cn.iocoder.yudao.framework.captcha.core.enums.CaptchaRedisKeyConstants;
import cn.iocoder.yudao.framework.captcha.core.service.RedisCaptchaServiceImpl;
import com.xingyuv.captcha.properties.AjCaptchaProperties;
import com.xingyuv.captcha.service.CaptchaCacheService;
@@ -15,12 +13,6 @@ import javax.annotation.Resource;
@AutoConfiguration
public class YudaoCaptchaConfiguration {
- static {
- // 手动加载 Lock4jRedisKeyConstants 类,因为它不会被使用到
- // 如果不加载,会导致 Redis 监控,看到它的 Redis Key 枚举
- ClassUtil.loadClass(CaptchaRedisKeyConstants.class.getName());
- }
-
@Resource
private StringRedisTemplate stringRedisTemplate;
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
index 3e1147c37..5fa5b5858 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
@@ -1,12 +1,5 @@
package cn.iocoder.yudao.framework.captcha.core.enums;
-import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
-import com.xingyuv.captcha.model.vo.PointVO;
-
-import java.time.Duration;
-
-import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
-
/**
* 验证码 Redis Key 枚举类
*
@@ -14,12 +7,22 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.S
*/
public interface CaptchaRedisKeyConstants {
- RedisKeyDefine AJ_CAPTCHA_REQ_LIMIT = new RedisKeyDefine("验证码的请求限流",
- "AJ.CAPTCHA.REQ.LIMIT-%s-%s",
- STRING, Integer.class, Duration.ofSeconds(60)); // 例如说:验证失败 5 次,get 接口锁定
+ /**
+ * 验证码的请求限流
+ *
+ * KEY 格式:AJ.CAPTCHA.REQ.LIMIT-%s-%s
+ * VALUE 数据类型:String // 例如说:验证失败 5 次,get 接口锁定
+ * 过期时间:60 秒
+ */
+ String AJ_CAPTCHA_REQ_LIMIT = "AJ.CAPTCHA.REQ.LIMIT-%s-%s";
- RedisKeyDefine AJ_CAPTCHA_RUNNING = new RedisKeyDefine("验证码的坐标",
- "RUNNING:CAPTCHA:%s", // AbstractCaptchaService.REDIS_CAPTCHA_KEY
- STRING, PointVO.class, Duration.ofSeconds(120)); // {"secretKey":"PP1w2Frr2KEejD2m","x":162,"y":5}
+ /**
+ * 验证码的坐标
+ *
+ * KEY 格式:RUNNING:CAPTCHA:%s // AbstractCaptchaService.REDIS_CAPTCHA_KEY
+ * VALUE 数据类型:String // PointVO.class {"secretKey":"PP1w2Frr2KEejD2m","x":162,"y":5}
+ * 过期时间:120 秒
+ */
+ String AJ_CAPTCHA_RUNNING = "RUNNING:CAPTCHA:%s";
}
diff --git a/yudao-framework/yudao-spring-boot-starter-env/pom.xml b/yudao-framework/yudao-spring-boot-starter-env/pom.xml
index 5e92fc081..3b5ca0771 100644
--- a/yudao-framework/yudao-spring-boot-starter-env/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-env/pom.xml
@@ -56,15 +56,6 @@
feign-core
-
- org.apache.dubbo
- dubbo-common
-
-
- org.apache.dubbo
- dubbo-cluster
-
-
com.alibaba.cloud
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/EnvEnvironmentPostProcessor.java b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/EnvEnvironmentPostProcessor.java
index 4c1cb44fe..29d8991e2 100644
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/EnvEnvironmentPostProcessor.java
+++ b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/EnvEnvironmentPostProcessor.java
@@ -13,16 +13,14 @@ import static cn.iocoder.yudao.framework.env.core.util.EnvUtils.HOST_NAME_VALUE;
/**
* 多环境的 {@link EnvEnvironmentPostProcessor} 实现类
- * 将 yudao.env.tag 设置到 dubbo、nacos 等组件对应的 tag 配置项,当且仅当它们不存在时
+ * 将 yudao.env.tag 设置到 nacos 等组件对应的 tag 配置项,当且仅当它们不存在时
*
* @author 芋道源码
*/
public class EnvEnvironmentPostProcessor implements EnvironmentPostProcessor {
private static final Set TARGET_TAG_KEYS = SetUtils.asSet(
- "spring.cloud.nacos.discovery.metadata.tag", // Nacos 注册中心
- "dubbo.provider.tag", // Dubbo 服务提供者的 tag
- "dubbo.consumer.tag" // Dubbo 服务消费者的 tag
+ "spring.cloud.nacos.discovery.metadata.tag" // Nacos 注册中心
// MQ TODO
);
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/YudaoEnvRpcAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/YudaoEnvRpcAutoConfiguration.java
index ab74f3205..b288f19d4 100644
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/YudaoEnvRpcAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/config/YudaoEnvRpcAutoConfiguration.java
@@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientSpecification;
+import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
@@ -24,24 +25,10 @@ public class YudaoEnvRpcAutoConfiguration {
// ========== Feign 相关 ==========
- // TODO @芋艿:由于 loadBalancerClientFactoryBeanPostProcessor 拦截不到 LoadBalancerClientFactory,所以采用 loadBalancerClientFactory 实现
-// @Bean
-// public BeanPostProcessor loadBalancerClientFactoryBeanPostProcessor(LoadBalancerClientsProperties properties) {
-// return new BeanPostProcessor() {
-// @Override
-// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-// if (!(bean instanceof LoadBalancerClientFactory)) {
-// return bean;
-// }
-// return bean;
-// }
-// };
-// }
-
/**
* 创建 {@link EnvLoadBalancerClientFactory} Bean
*
- * 参考 {@link org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration#loadBalancerClientFactory(LoadBalancerClientsProperties)} 方法
+ * 参考 {@link LoadBalancerAutoConfiguration#loadBalancerClientFactory(LoadBalancerClientsProperties)} 方法
*/
@Bean
public LoadBalancerClientFactory loadBalancerClientFactory(LoadBalancerClientsProperties properties,
@@ -56,6 +43,4 @@ public class YudaoEnvRpcAutoConfiguration {
return new EnvRequestInterceptor();
}
- // ========== Dubbo 相关 ==========
-
}
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboConsumerRouterTagClusterInterceptor.java b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboConsumerRouterTagClusterInterceptor.java
deleted file mode 100644
index b03c7c2c7..000000000
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboConsumerRouterTagClusterInterceptor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.framework.env.core.dubbo;
-
-import cn.iocoder.yudao.framework.env.core.context.EnvContextHolder;
-import org.apache.dubbo.common.constants.CommonConstants;
-import org.apache.dubbo.common.extension.Activate;
-import org.apache.dubbo.rpc.Invocation;
-import org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor;
-import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
-import org.springframework.util.StringUtils;
-
-/**
- * Consumer 方,在调用 Provider 时,将 {@link EnvContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
- *
- * 完整逻辑说明,见 {@link DubboProviderRouterTagFilter}
- *
- * 注意,这里需要设置到 order = 1 的原因,是需要保证排在 ConsumerContextClusterInterceptor 之后
- */
-@Activate(group = CommonConstants.CONSUMER, order = 1)
-public class DubboConsumerRouterTagClusterInterceptor implements ClusterInterceptor {
-
- @Override
- public void before(AbstractClusterInvoker> clusterInvoker, Invocation invocation) {
- // 设置 Dubbo Tag 到 Dubbo 隐式传参
- String tag = EnvContextHolder.getTag();
- if (StringUtils.hasText(tag)) {
- invocation.setAttachment(CommonConstants.TAG_KEY, tag);
- }
- }
-
- @Override
- public void after(AbstractClusterInvoker> clusterInvoker, Invocation invocation) {
- // 清空 Dubbo Tag 的隐式传参
- invocation.setAttachment(CommonConstants.TAG_KEY, null);
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboProviderRouterTagFilter.java b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboProviderRouterTagFilter.java
deleted file mode 100644
index d24f79bd1..000000000
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/dubbo/DubboProviderRouterTagFilter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package cn.iocoder.yudao.framework.env.core.dubbo;
-
-import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.env.core.context.EnvContextHolder;
-import org.apache.dubbo.common.constants.CommonConstants;
-import org.apache.dubbo.common.extension.Activate;
-import org.apache.dubbo.rpc.*;
-import org.apache.dubbo.rpc.cluster.router.tag.TagRouter;
-
-/**
- * 基于 Dubbo 标签路由规则(http://dubbo.apache.org/zh-cn/docs/user/demos/routing-rule.html),实现如下功能:
- * 1. 本地开发调试时,在带有 Dubbo Tag 的情况下,优先调用指定 Tag 的服务提供者。这样,我们可以将本地启动的服务提供者打上相应的 Tag,即可优先调用本地;
- * 并且,前端在调用开发环境上的 Dubbo 服务时,因为不带有 Dubbo Tag,所以不会调用到后端开发本地启动的 Dubbo 服务提供者;
- * 2. TODO 优化点:蓝绿发布、灰度发布
- *
- * 实现逻辑为:
- * 1. 对于 Consumer 方,在调用 Provider 时,{@link DubboConsumerRouterTagClusterInterceptor} 会将 {@link EnvContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
- * 同时,Dubbo 自带 {@link TagRouter},会根据该参数,会选择符合该 Tag 的 Provider。
- * 2. 对于 Provider 方,在通过 Dubbo 隐式传参获得到 Tag 时,会设置到 {@link EnvContextHolder} 中。
- * 这样,在 Provider 作为 Consumer 角色时,调用其它 Provider 时,可以继续实现标签路由的功能。
- */
-@Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = -1000)
-public class DubboProviderRouterTagFilter implements Filter {
-
- @Override
- public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
- // 情况一,没有 tag 时,直接调用即可
- String tag = invocation.getAttachment(CommonConstants.TAG_KEY);
- if (StrUtil.isEmpty(tag)) {
- return invoker.invoke(invocation);
- }
-
- // 情况二,有 tag 时,从 Dubbo 隐式传参获得 Dubbo Tag
- EnvContextHolder.setTag(tag);
- // 继续调用
- try {
- return invoker.invoke(invocation);
- } finally {
- EnvContextHolder.removeTag();
- }
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/util/EnvUtils.java b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/util/EnvUtils.java
index 0b393deaf..ccb4bb71a 100644
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/util/EnvUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-env/src/main/java/cn/iocoder/yudao/framework/env/core/util/EnvUtils.java
@@ -1,14 +1,13 @@
package cn.iocoder.yudao.framework.env.core.util;
-import cn.hutool.core.net.NetUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.env.config.EnvProperties;
import feign.RequestTemplate;
+import lombok.SneakyThrows;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.core.env.Environment;
import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
import java.util.Objects;
/**
@@ -44,8 +43,14 @@ public class EnvUtils {
requestTemplate.header(HEADER_TAG, tag);
}
+ /**
+ * 获得 hostname 主机名
+ *
+ * @return 主机名
+ */
+ @SneakyThrows
public static String getHostName() {
- return StrUtil.blankToDefault(NetUtil.getLocalHostName(), IdUtil.fastSimpleUUID());
+ return InetAddress.getLocalHost().getHostName();
}
}
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
deleted file mode 100644
index c0984fdb5..000000000
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
+++ /dev/null
@@ -1 +0,0 @@
-dubboProviderRouterTagFilter=cn.iocoder.yudao.framework.env.core.dubbo.DubboProviderRouterTagFilter
diff --git a/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor b/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
deleted file mode 100644
index 03d7a5765..000000000
--- a/yudao-framework/yudao-spring-boot-starter-env/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
+++ /dev/null
@@ -1 +0,0 @@
-dubboConsumerRouterTagClusterInterceptor=cn.iocoder.yudao.framework.env.core.dubbo.DubboConsumerRouterTagClusterInterceptor
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
index a831337e8..9eed6d0e0 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
@@ -103,8 +103,16 @@ public interface BaseMapperX extends BaseMapper {
update(update, new QueryWrapper<>());
}
+ default void updateBatch(Collection entities) {
+ Db.updateBatchById(entities);
+ }
+
default void updateBatch(Collection entities, int size) {
Db.updateBatchById(entities, size);
}
+ default void saveOrUpdateBatch(Collection collection) {
+ Db.saveOrUpdateBatch(collection);
+ }
+
}
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/EncryptTypeHandler.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/EncryptTypeHandler.java
index 9327ebbfe..7ef0f4ece 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/EncryptTypeHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/EncryptTypeHandler.java
@@ -13,7 +13,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
/**
- * 字段字段的 TypeHandler 实现类,基于 {@link AES} 实现
+ * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现
* 可通过 jasypt.encryptor.password 配置项,设置密钥
*
* @author 芋道源码
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/redis/IdempotentRedisDAO.java b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/redis/IdempotentRedisDAO.java
index 05e1c6bd2..e3a79414d 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/redis/IdempotentRedisDAO.java
+++ b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/redis/IdempotentRedisDAO.java
@@ -1,13 +1,10 @@
package cn.iocoder.yudao.framework.idempotent.core.redis;
-import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;
-import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
-
/**
* 幂等 Redis DAO
*
@@ -16,9 +13,14 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.S
@AllArgsConstructor
public class IdempotentRedisDAO {
- private static final RedisKeyDefine IDEMPOTENT = new RedisKeyDefine("幂等操作",
- "idempotent:%s", // 参数为 uuid
- STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
+ /**
+ * 幂等操作
+ *
+ * KEY 格式:idempotent:%s // 参数为 uuid
+ * VALUE 格式:String
+ * 过期时间:不固定
+ */
+ private static final String IDEMPOTENT = "idempotent:%s";
private final StringRedisTemplate redisTemplate;
@@ -28,7 +30,7 @@ public class IdempotentRedisDAO {
}
private static String formatKey(String key) {
- return String.format(IDEMPOTENT.getKeyTemplate(), key);
+ return String.format(IDEMPOTENT, key);
}
}
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/config/YudaoLock4jConfiguration.java b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/config/YudaoLock4jConfiguration.java
index 2986da6c8..2fc7f21ea 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/config/YudaoLock4jConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/config/YudaoLock4jConfiguration.java
@@ -1,21 +1,13 @@
package cn.iocoder.yudao.framework.lock4j.config;
-import cn.hutool.core.util.ClassUtil;
-import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration;
import cn.iocoder.yudao.framework.lock4j.core.DefaultLockFailureStrategy;
-import cn.iocoder.yudao.framework.lock4j.core.Lock4jRedisKeyConstants;
+import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
@AutoConfiguration(before = LockAutoConfiguration.class)
public class YudaoLock4jConfiguration {
- static {
- // 手动加载 Lock4jRedisKeyConstants 类,因为它不会被使用到
- // 如果不加载,会导致 Redis 监控,看到它的 Redis Key 枚举
- ClassUtil.loadClass(Lock4jRedisKeyConstants.class.getName());
- }
-
@Bean
public DefaultLockFailureStrategy lockFailureStrategy() {
return new DefaultLockFailureStrategy();
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/core/Lock4jRedisKeyConstants.java b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/core/Lock4jRedisKeyConstants.java
index cc01a253b..693d05252 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/core/Lock4jRedisKeyConstants.java
+++ b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/lock4j/core/Lock4jRedisKeyConstants.java
@@ -1,10 +1,5 @@
package cn.iocoder.yudao.framework.lock4j.core;
-import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
-import org.redisson.api.RLock;
-
-import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.HASH;
-
/**
* Lock4j Redis Key 枚举类
*
@@ -12,8 +7,13 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.H
*/
public interface Lock4jRedisKeyConstants {
- RedisKeyDefine LOCK4J = new RedisKeyDefine("分布式锁",
- "lock4j:%s", // 参数来自 DefaultLockKeyBuilder 类
- HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构
+ /**
+ * 分布式锁
+ *
+ * KEY 格式:lock4j:%s // 参数来自 DefaultLockKeyBuilder 类
+ * VALUE 数据格式:HASH // RLock.class:Redisson 的 Lock 锁,使用 Hash 数据结构
+ * 过期时间:不固定
+ */
+ String LOCK4J = "lock4j:%s";
}
diff --git a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
index 4b11789b4..13b447b71 100644
--- a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
@@ -36,6 +36,11 @@
io.netty
netty-all
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
diff --git a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoCacheAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoCacheAutoConfiguration.java
index 0b837569e..1442e8a83 100644
--- a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoCacheAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoCacheAutoConfiguration.java
@@ -1,5 +1,7 @@
package cn.iocoder.yudao.framework.redis.config;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.redis.core.TimeoutRedisCacheManager;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -7,8 +9,15 @@ import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
-import org.springframework.data.redis.serializer.RedisSerializer;
+
+import java.util.Objects;
+
+import static cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration.buildRedisSerializer;
/**
* Cache 配置类,基于 Redis 实现
@@ -20,15 +29,19 @@ public class YudaoCacheAutoConfiguration {
/**
* RedisCacheConfiguration Bean
- *
+ *
* 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法
*/
@Bean
@Primary
public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
- // 设置使用 JSON 序列化方式
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
- config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
+ // 设置使用 : 单冒号,而不是双 :: 冒号,避免 Redis Desktop Manager 多余空格
+ // 详细可见 https://blog.csdn.net/chuixue24/article/details/103928965 博客
+ config = config.computePrefixWith(cacheName -> cacheName + StrUtil.COLON);
+ // 设置使用 JSON 序列化方式
+ config = config.serializeValuesWith(
+ RedisSerializationContext.SerializationPair.fromSerializer(buildRedisSerializer()));
// 设置 CacheProperties.Redis 的属性
CacheProperties.Redis redisProperties = cacheProperties.getRedis();
@@ -47,4 +60,14 @@ public class YudaoCacheAutoConfiguration {
return config;
}
+ @Bean
+ public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate,
+ RedisCacheConfiguration redisCacheConfiguration) {
+ // 创建 RedisCacheWriter 对象
+ RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory());
+ RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
+ // 创建 TenantRedisCacheManager 对象
+ return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration);
+ }
+
}
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 901830c69..5904a3a2b 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,5 +1,8 @@
package cn.iocoder.yudao.framework.redis.config;
+import cn.hutool.core.util.ReflectUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -25,9 +28,17 @@ public class YudaoRedisAutoConfiguration {
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
- template.setValueSerializer(RedisSerializer.json());
- template.setHashValueSerializer(RedisSerializer.json());
+ template.setValueSerializer(buildRedisSerializer());
+ template.setHashValueSerializer(buildRedisSerializer());
return template;
}
+ public static RedisSerializer> buildRedisSerializer() {
+ RedisSerializer