From 76e9ec060e8b54c84328cd87a5d604f906b64a76 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 16:27:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?sms4j-solon-plugin-example=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/org/dromara/sms4j/example/Sms4jTest.java | 3 --- .../src/test/java/org/dromara/sms4j/example/SmsOaTest.java | 3 --- .../test/java/org/dromara/sms4j/example/SmsProcessorTest.java | 3 --- .../src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java | 3 --- 4 files changed, 12 deletions(-) diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index 50ffda29..677a034a 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -18,8 +18,6 @@ import org.dromara.sms4j.jg.service.JgSmsImpl; import org.dromara.sms4j.lianlu.service.LianLuSmsImpl; import org.dromara.sms4j.luosimao.service.LuoSiMaoSmsImpl; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -30,7 +28,6 @@ import java.util.List; import java.util.Map; @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class Sms4jTest { diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java index f1c1d76d..4ec1653f 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java @@ -10,8 +10,6 @@ import org.dromara.oa.core.dingTalk.config.DingTalkConfig; import org.dromara.oa.core.provider.factory.OaFactory; import org.dromara.oa.core.weTalk.config.WeTalkConfig; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -20,7 +18,6 @@ import java.util.concurrent.CountDownLatch; @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsOaTest { //***********************DingTalk-Test************************// diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java index c5f28537..9e318f35 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java @@ -9,8 +9,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.utils.SmsUtils; import org.dromara.sms4j.core.factory.SmsFactory; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -21,7 +19,6 @@ import java.util.LinkedHashMap; * @author sh1yu */ @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsProcessorTest { /** diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java index 3c294863..c5dda3f2 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java @@ -5,8 +5,6 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.aliyun.config.AlibabaConfig; import org.dromara.sms4j.comm.utils.SmsUtils; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -16,7 +14,6 @@ import java.util.List; * @author handy */ @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsUtilsTest { From ff4d6d8bf483fd1618b1a5187a18b2294d4db624 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 16:28:38 +0800 Subject: [PATCH 2/5] =?UTF-8?q?solon=20=E5=8D=87=E4=B8=BA=203.0.1=EF=BC=88?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=202.x=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/org/dromara/sms4j/solon/config/SupplierConfig.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3a5dd1cd..44094081 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 UTF-8 2.7.18 - 2.6.5 + 3.0.1 3.17.0 1.3.3 5.8.28 diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java index 194ceedd..b9a092a9 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java @@ -30,13 +30,13 @@ public class SupplierConfig { } @Bean - protected Map> blends() { + public Map> blends() { return injectObj("sms.blends", new LinkedHashMap<>()); } @Bean - protected SmsBlendsInitializer smsBlendsInitializer(List factoryList, + public SmsBlendsInitializer smsBlendsInitializer(List factoryList, SmsConfig smsConfig, Map> blends) { From 98e779376d9a3fe0ae49af1d2703835716f06b82 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 17:19:58 +0800 Subject: [PATCH 3/5] =?UTF-8?q?sms4j-solon-plugin=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20SupplierConfig=20=E9=80=82=E9=85=8D=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms4j/solon/config/SupplierConfig.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java index b9a092a9..31a6905e 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java @@ -1,6 +1,9 @@ package org.dromara.sms4j.solon.config; +import cn.hutool.core.util.ObjectUtil; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.comm.enums.ConfigType; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.noear.solon.annotation.Bean; @@ -29,16 +32,37 @@ public class SupplierConfig { return obj; } - @Bean + @Bean("blends") public Map> blends() { return injectObj("sms.blends", new LinkedHashMap<>()); } + @Bean + @Condition(onBean = SmsConfig.class) + public List factoryList(@Inject("blends") Map> blends, SmsConfig smsConfig) throws Exception { + //注入自定义实现工厂 + List factoryList = new ArrayList<>(); + if (ConfigType.YAML.equals(smsConfig.getConfigType())) { + for (String configId : blends.keySet()) { + Map configMap = blends.get(configId); + Object factoryPath = configMap.get(Constant.FACTORY_PATH); + if (ObjectUtil.isNotEmpty(factoryPath)) { + //反射创建实例 + Class> newClass = (Class>) Class.forName(factoryPath.toString()); + BaseProviderFactory factory = newClass.newInstance(); + factoryList.add(factory); + } + } + } + + return factoryList; + } + @Bean public SmsBlendsInitializer smsBlendsInitializer(List factoryList, - SmsConfig smsConfig, - Map> blends) { + SmsConfig smsConfig, + @Inject("blends") Map> blends) { //todo: solon 不支持泛型的 List[Bean] 注入 List> factoryList2 = new ArrayList<>(factoryList.size()); From 49c5af9f7032e0c0d2a67189c250c5c5e70a1265 Mon Sep 17 00:00:00 2001 From: noear Date: Sat, 4 Jan 2025 18:33:57 +0800 Subject: [PATCH 4/5] =?UTF-8?q?sms4j-solon-plugin=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E9=80=82=E9=85=8D=EF=BC=88=E5=90=8C=E6=AD=A5=20spring?= =?UTF-8?q?boot=20=E7=9A=84=E9=80=82=E9=85=8D=E4=BB=A3=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/sms4j/solon/Sms4jPlugin.java | 17 ++++ .../org/dromara/sms4j/solon/XPluginImpl.java | 17 ---- .../adaptor/ConfigCombineMapAdaptor.java | 40 +++++++++ .../solon/config/SmsAutowiredConfig.java | 60 ------------- .../solon/config/SmsBlendsInitializer.java | 88 +++++++++++-------- .../sms4j/solon/config/SmsMainConfigure.java | 34 +++++++ ...lierConfig.java => SupplierConfigure.java} | 35 ++++---- .../sms4j/solon/holder/SolonSmsDaoHolder.java | 18 +--- .../solon/sms4j-solon-plugin.properties | 4 +- 9 files changed, 166 insertions(+), 147 deletions(-) create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java delete mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java delete mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java rename sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/{SupplierConfig.java => SupplierConfigure.java} (60%) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java new file mode 100644 index 00000000..240598d2 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java @@ -0,0 +1,17 @@ +package org.dromara.sms4j.solon; + +import org.dromara.sms4j.solon.config.SmsMainConfigure; +import org.dromara.sms4j.solon.config.SupplierConfigure; +import org.noear.solon.core.AppContext; +import org.noear.solon.core.Plugin; + +/** + * @author noear 2023/5/16 created + */ +public class Sms4jPlugin implements Plugin { + @Override + public void start(AppContext context) { + context.beanMake(SmsMainConfigure.class); + context.beanMake(SupplierConfigure.class); + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java deleted file mode 100644 index fea6bb21..00000000 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.dromara.sms4j.solon; - -import org.dromara.sms4j.solon.config.SmsAutowiredConfig; -import org.dromara.sms4j.solon.config.SupplierConfig; -import org.noear.solon.core.AppContext; -import org.noear.solon.core.Plugin; - -/** - * @author noear 2023/5/16 created - */ -public class XPluginImpl implements Plugin { - @Override - public void start(AppContext context) { - context.beanMake(SmsAutowiredConfig.class); - context.beanMake(SupplierConfig.class); - } -} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java new file mode 100644 index 00000000..560be275 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java @@ -0,0 +1,40 @@ +package org.dromara.sms4j.solon.adaptor; + +import cn.hutool.core.bean.BeanUtil; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; +import org.dromara.sms4j.provider.config.BaseConfig; + +import java.util.*; + +public class ConfigCombineMapAdaptor extends HashMap { + @Override + public M get(Object key) { + Object o = super.get(key); + if (null == o){ + Set configKeySet = this.keySet(); + for (Object insideMapKey : configKeySet) { + if (((String)insideMapKey).startsWith(SmsReadConfig.class.getSimpleName())){ + Map smsBlendsConfigInsideMap = (Map) this.get(insideMapKey); + SmsReadConfig config = (SmsReadConfig) smsBlendsConfigInsideMap.get(insideMapKey); + BaseConfig supplierConfig = config.getSupplierConfig((String)key); + List supplierConfigList = config.getSupplierConfigList(); + if (null == supplierConfigList){ + supplierConfigList = new ArrayList<>(); + } + if (null != supplierConfig){ + supplierConfigList.add(supplierConfig); + } + for (BaseConfig baseConfig : supplierConfigList) { + if (key.equals(baseConfig.getConfigId())){ + Map configMap = BeanUtil.beanToMap(baseConfig); + this.put(baseConfig.getConfigId(),configMap); + return (M)configMap; + } + } + } + } + return null; + } + return (M)o; + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java deleted file mode 100644 index 55a5ddfc..00000000 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dromara.sms4j.solon.config; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.sms4j.comm.constant.Constant; -import org.dromara.sms4j.comm.delayedTime.DelayedTime; -import org.dromara.sms4j.provider.config.SmsBanner; -import org.dromara.sms4j.provider.config.SmsConfig; -import org.dromara.sms4j.provider.factory.BeanFactory; -import org.noear.solon.annotation.Bean; -import org.noear.solon.annotation.Configuration; -import org.noear.solon.annotation.Inject; -import org.noear.solon.core.AppContext; -import org.noear.solon.core.bean.LifecycleBean; - -import java.util.concurrent.Executor; - -@Slf4j -@Configuration -public class SmsAutowiredConfig implements LifecycleBean { - - @Inject - AppContext context; - - private T injectObj(String prefix, T obj) { - //@Inject 只支持在字段、参数、类型上注入 - context.cfg().getProp(prefix).bindTo(obj); - return obj; - } - - @Bean - public SmsConfig smsConfig() { - return injectObj("sms", BeanFactory.getSmsConfig()); - } - - /** - * 注入一个定时器 - */ - @Bean - public DelayedTime delayedTime() { - return BeanFactory.getDelayedTime(); - } - - /** - * 注入线程池 - */ - @Bean("smsExecutor") - public Executor taskExecutor(@Inject SmsConfig config) { - return BeanFactory.setExecutor(config); - } - - - //是在 solon 容器扫描完成之后执行的 - @Override - public void start() { - //打印banner - if (BeanFactory.getSmsConfig().getIsPrint()) { - SmsBanner.PrintBanner(Constant.VERSION); - } - } -} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java index 9f8ed655..7c891076 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java @@ -13,7 +13,9 @@ import org.dromara.sms4j.budingyun.config.BudingV2Factory; import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.comm.enums.ConfigType; import org.dromara.sms4j.comm.utils.SmsUtils; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.core.proxy.EnvirmentHolder; import org.dromara.sms4j.core.proxy.SmsProxyFactory; @@ -36,15 +38,15 @@ import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.dromara.sms4j.provider.factory.ProviderFactoryHolder; import org.dromara.sms4j.qiniu.config.QiNiuFactory; -import org.dromara.sms4j.solon.holder.SolonSmsDaoHolder; +import org.dromara.sms4j.solon.adaptor.ConfigCombineMapAdaptor; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; import org.dromara.sms4j.yixintong.config.YiXintongFactory; import org.dromara.sms4j.yunpian.config.YunPianFactory; import org.dromara.sms4j.zhutong.config.ZhutongFactory; -import org.noear.solon.core.AppContext; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; @@ -56,56 +58,69 @@ public class SmsBlendsInitializer { private final SmsConfig smsConfig; private final Map> blends; - private final AppContext context; + private final List extendsSmsConfigs; public SmsBlendsInitializer(List> factoryList, SmsConfig smsConfig, Map> blends, - AppContext context - ){ + List extendsSmsConfigs){ this.factoryList = factoryList; this.smsConfig = smsConfig; this.blends = blends; - this.context = context; - onApplicationEvent(); + this.extendsSmsConfigs = extendsSmsConfigs; + + this.initDo(); } - public void onApplicationEvent() { + private void initDo() { this.registerDefaultFactory(); // 注册短信对象工厂 ProviderFactoryHolder.registerFactory(factoryList); - //持有初始化配置信息 - EnvirmentHolder.frozenEnvirmet(smsConfig, blends); - //框架依赖持有缓存扩展 - new SolonSmsDaoHolder(context); - //注册执行器实现 - SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); - //如果手机号校验器存在实现,则注册手机号校验器 + //如果手机号校验器存在实现,则注册手机号校验器(暂不可用) ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } - // 解析供应商配置 - for(String configId : blends.keySet()) { - Map configMap = blends.get(configId); - Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); - String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); - supplier = StrUtil.isEmpty(supplier) ? configId : supplier; - BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); - if(providerFactory == null) { - log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); - continue; - } - configMap.put("config-id", configId); - SmsUtils.replaceKeysSeparator(configMap, "-", "_"); - JSONObject configJson = new JSONObject(configMap); - SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass()); - SmsFactory.createSmsBlend(supplierConfig); + //注册执行器实现 + if(this.smsConfig.getRestricted()){ + SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); } + if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) { + //持有初始化配置信息 + Map> blendsInclude = new ConfigCombineMapAdaptor>(); + blendsInclude.putAll(this.blends); + int num = 0; + for (SmsReadConfig smsReadConfig : extendsSmsConfigs) { + String key = SmsReadConfig.class.getSimpleName() + num; + Map insideMap = new HashMap<>(); + insideMap.put(key, smsReadConfig); + blendsInclude.put(key, insideMap); + num++; + } + EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude); + // 解析供应商配置 + for (String configId : blends.keySet()) { + Map configMap = blends.get(configId); + Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); + String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); + supplier = StrUtil.isEmpty(supplier) ? configId : supplier; + BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); + if (providerFactory == null) { + log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); + continue; + } + configMap.put("config-id", configId); + SmsUtils.replaceKeysSeparator(configMap, "-", "_"); + JSONObject configJson = new JSONObject(configMap); + org.dromara.sms4j.api.universal.SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass()); + SmsFactory.createSmsBlend(supplierConfig); + } + } + } @@ -135,8 +150,11 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(SubMailFactory.instance()); ProviderFactoryHolder.registerFactory(DanMiFactory.instance()); ProviderFactoryHolder.registerFactory(YiXintongFactory.instance()); - if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { - ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); + if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { + if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { + ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); + } + log.debug("加载内置运营商完成!"); } } diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java new file mode 100644 index 00000000..08120099 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java @@ -0,0 +1,34 @@ +package org.dromara.sms4j.solon.config; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.provider.config.SmsBanner; +import org.dromara.sms4j.provider.config.SmsConfig; +import org.dromara.sms4j.provider.factory.BeanFactory; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Init; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.AppContext; + +@Slf4j +@Configuration +public class SmsMainConfigure { + @Inject + AppContext context; + + @Bean + public SmsConfig smsConfig() { + return context.cfg().getProp("sms") + .bindTo(BeanFactory.getSmsConfig()); + } + + //是在 solon 容器扫描完成之后执行的 + @Init + public void init() { + //打印banner + if (BeanFactory.getSmsConfig().getIsPrint()) { + SmsBanner.PrintBanner(Constant.VERSION); + } + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java similarity index 60% rename from sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java rename to sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java index 31a6905e..9aa0c06b 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java @@ -2,8 +2,10 @@ package org.dromara.sms4j.solon.config; import cn.hutool.core.util.ObjectUtil; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.enums.ConfigType; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.noear.solon.annotation.Bean; @@ -18,11 +20,11 @@ import java.util.List; import java.util.Map; /** - * smsConfig参数意义为确保注入时smsConfig已经存在 + * smsConfig 参数意义为确保注入时 smsConfig 已经存在 */ @Condition(onProperty = "${sms.configType}=yaml") @Configuration -public class SupplierConfig { +public class SupplierConfigure { @Inject AppContext context; @@ -33,44 +35,43 @@ public class SupplierConfig { } @Bean("blends") + @Condition(onProperty = "${sms.configType} = yaml") public Map> blends() { - return injectObj("sms.blends", new LinkedHashMap<>()); + return context.cfg().getProp("sms.blends").bindTo(new LinkedHashMap<>()); } @Bean @Condition(onBean = SmsConfig.class) - public List factoryList(@Inject("blends") Map> blends, SmsConfig smsConfig) throws Exception { + public List> factoryList( + @Inject("blends") Map> blends, + SmsConfig smsConfig) throws Exception { //注入自定义实现工厂 - List factoryList = new ArrayList<>(); + List> factoryList = new ArrayList<>(); if (ConfigType.YAML.equals(smsConfig.getConfigType())) { for (String configId : blends.keySet()) { Map configMap = blends.get(configId); Object factoryPath = configMap.get(Constant.FACTORY_PATH); if (ObjectUtil.isNotEmpty(factoryPath)) { //反射创建实例 - Class> newClass = (Class>) Class.forName(factoryPath.toString()); - BaseProviderFactory factory = newClass.newInstance(); + Class> newClass = (Class>) Class.forName(factoryPath.toString()); + BaseProviderFactory factory = newClass.newInstance(); factoryList.add(factory); } } } - return factoryList; } @Bean - public SmsBlendsInitializer smsBlendsInitializer(List factoryList, + public SmsBlendsInitializer smsBlendsInitializer(List> factoryList, SmsConfig smsConfig, - @Inject("blends") Map> blends) { - - //todo: solon 不支持泛型的 List[Bean] 注入 - List> factoryList2 = new ArrayList<>(factoryList.size()); - for (BaseProviderFactory factory : factoryList) { - factoryList2.add((BaseProviderFactory) factory); + @Inject("blends") Map> blends, + @Inject(required = false) List extendsSmsConfigs) { + if (extendsSmsConfigs == null) { + extendsSmsConfigs = new ArrayList<>(); } - - return new SmsBlendsInitializer(factoryList2, smsConfig, blends, context); + return new SmsBlendsInitializer(factoryList, smsConfig, blends, extendsSmsConfigs); } } diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java index cef3c875..e5a28eed 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java @@ -1,22 +1,10 @@ package org.dromara.sms4j.solon.holder; import org.dromara.sms4j.api.dao.SmsDao; -import org.dromara.sms4j.api.dao.SmsDaoDefaultImpl; -import org.dromara.sms4j.comm.utils.SmsUtils; -import org.noear.solon.core.AppContext; - -public class SolonSmsDaoHolder{ - - private static SmsDao smsDao; - - public SolonSmsDaoHolder(AppContext context) { - context.getBeanAsync(SmsDao.class, bean -> smsDao = bean); - } +import org.noear.solon.Solon; +public class SolonSmsDaoHolder { public static SmsDao getSmsDao() { - if (SmsUtils.isEmpty(smsDao)){ - smsDao = SmsDaoDefaultImpl.getInstance(); - } - return smsDao; + return Solon.context().getBean(SmsDao.class); } } diff --git a/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties b/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties index 07519a28..1c2e6360 100644 --- a/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties +++ b/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties @@ -1,4 +1,2 @@ -#??????? -solon.plugin=org.dromara.sms4j.solon.XPluginImpl -#?????????????????0 +solon.plugin=org.dromara.sms4j.solon.Sms4jPlugin solon.plugin.priority=1 \ No newline at end of file From 44287e62d47241dddf0dcd7869431164feb8804c Mon Sep 17 00:00:00 2001 From: noear Date: Sat, 4 Jan 2025 18:44:27 +0800 Subject: [PATCH 5/5] =?UTF-8?q?sms4j-solon-plugin-example=EF=BC=9A=20sprin?= =?UTF-8?q?gboot=20=E7=9A=84=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/zhangjun/ZhangJunSmsImpl.java | 11 ++------ .../src/main/resources/app.yml | 28 ++++++++++++------- .../org/dromara/sms4j/example/Sms4jTest.java | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java index fc99662e..bcb6ef29 100644 --- a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java +++ b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java @@ -4,6 +4,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.api.utils.SmsRespUtils; import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.utils.SmsUtils; @@ -90,9 +91,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { try { smsResponse = getResponse(http.postJson(getConfig().getUrl(), null, message)); } catch (SmsBlendException e) { - smsResponse = new SmsResponse(); - smsResponse.setSuccess(false); - smsResponse.setData(e.getMessage()); + smsResponse = errorResp(e.message); } if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { retry = 0; @@ -109,11 +108,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { } private SmsResponse getResponse(JSONObject resJson) { - SmsResponse smsResponse = new SmsResponse(); - smsResponse.setSuccess("OK".equals(resJson.getStr("Code"))); - smsResponse.setData(resJson); - smsResponse.setConfigId(getConfigId()); - return smsResponse; + return SmsRespUtils.resp(resJson, "OK".equals(resJson.getStr("Code")), getConfigId()); } } \ No newline at end of file diff --git a/sms4j-solon-plugin-example/src/main/resources/app.yml b/sms4j-solon-plugin-example/src/main/resources/app.yml index 1780baae..63ef4e5a 100644 --- a/sms4j-solon-plugin-example/src/main/resources/app.yml +++ b/sms4j-solon-plugin-example/src/main/resources/app.yml @@ -79,13 +79,13 @@ sms: access-key-secret: 你的Access Key Secret sdkAppId: 你的应用ID #自定义广州掌骏短信,添加factory全路径。config,factory,SmsImpl复制其他默认实现即可,修改对应的supplier和发送核心逻辑即可 -# zhangjun: -# supplier: zhangjun -# factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory -# templateId: d2a****777 -# appId: 64c52d2a****77775fe72e3 -# sid: d2a****777 -# url: https://sms.idowe.com/**/**/**/send + # zhangjun: + # supplier: zhangjun + # factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory + # templateId: d2a****777 + # appId: 64c52d2a****77775fe72e3 + # sid: d2a****777 + # url: https://sms.idowe.com/**/**/**/send qiniu: access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2 access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1 @@ -155,21 +155,29 @@ sms: accessKeyId: ACCOUNT SID accessKeySecret: AUTH TOKEN action: 默认请求方法 distributor/sendSMS + # 一信通 + yixintong: + sp-code: xxxxxx #(必填)企业编号 + access-key-id: xxxxxx #(必填)用户名 + access-key-secret: 324gaxxxxxxxxxxxxxxxxx9sdf89 #(必填)接口密钥(正式帐户需要登陆平台,接口业务-接口申请右侧钥匙状图标查看或获取,接口密钥获取后十分钟生效) + template-id: #(可选)模板编号(若配置此参数,则会默认使用该模板,以便提高服务方性能) + sign-code: #(可选)短信前置签名编号(登陆平台-接口业务-我的签名查看) + f: 1 #(可选)默认为1,提交时检测方式 sms-oa: config-type: yaml oas: oaDingTalkByYaml: # configId isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) - supplier: dingding # 厂商标识 + supplier: ding_ding # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaByteTalkByYaml: # configId - supplier: feishu # 厂商标识 + supplier: byte_talk # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaWeTalkByYaml: - supplier: wetalk # 厂商标识 + supplier: we_talk # 厂商标识 tokenId: 您的sign core-pool-size: 20 queue-capacity: 20 diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index 677a034a..12534da3 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -1,5 +1,6 @@ package org.dromara.sms4j.example; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.UUID; @@ -530,4 +531,31 @@ public class Sms4jTest { SmsResponse smsResponse5 = danMiSms.voiceTemplate(PHONE, "opipedlqza", "111,222,333"); Assert.isTrue(smsResponse5.isSuccess()); } + + + /** + * 联通一信通模板 + */ + @Test + public void yixintongSmsTest() { + if (StrUtil.isBlank(PHONE)) { + return; + } + + //短信发送模板:你有一项编号为{xxxxxxxxx}的事务需要处理{x} + //其中的{xxxxxx}代表短信模板中的变量部分,可变化,一个x代表一个字或者字符,{}为变量标识,在发送时不用传。实发变量字数小于等于x的个数。 + + // 单发 + String message1 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse1 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).sendMessage(PHONE, message1); + log.info(JSONUtil.toJsonStr(smsResponse1)); + Assert.isTrue(smsResponse1.isSuccess()); + + // 群发 + List phones = CollectionUtil.toList(PHONE); + String message2 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse2 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).massTexting(phones, message2); + log.info(JSONUtil.toJsonStr(smsResponse2)); + Assert.isTrue(smsResponse2.isSuccess()); + } }