mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 08:58:38 +08:00
!189 sms4j-solon-plugin:重新适配(同步 springboot 的适配代码)
Merge pull request !189 from 西东/dev-3.0.x
This commit is contained in:
commit
e6173c5d2f
2
pom.xml
2
pom.xml
@ -58,7 +58,7 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<spring.boot.version>2.7.18</spring.boot.version>
|
||||
<solon.version>2.6.5</solon.version>
|
||||
<solon.version>3.0.1</solon.version>
|
||||
<redisson.version>3.17.0</redisson.version>
|
||||
<jdcloud.version>1.3.3</jdcloud.version>
|
||||
<hutool.version>5.8.28</hutool.version>
|
||||
|
||||
@ -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<ZhangJunConfig> {
|
||||
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<ZhangJunConfig> {
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
@ -18,8 +19,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 +29,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@ExtendWith(SolonJUnit5Extension.class)
|
||||
@SolonTest
|
||||
public class Sms4jTest {
|
||||
|
||||
@ -533,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<String> 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());
|
||||
}
|
||||
}
|
||||
|
||||
@ -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************************//
|
||||
|
||||
@ -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 {
|
||||
/**
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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<S, M> 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<BaseConfig> 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<String, Object> configMap = BeanUtil.beanToMap(baseConfig);
|
||||
this.put(baseConfig.getConfigId(),configMap);
|
||||
return (M)configMap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return (M)o;
|
||||
}
|
||||
}
|
||||
@ -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> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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<String, Map<String, Object>> blends;
|
||||
private final AppContext context;
|
||||
private final List<SmsReadConfig> extendsSmsConfigs;
|
||||
|
||||
public SmsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList,
|
||||
SmsConfig smsConfig,
|
||||
Map<String, Map<String, Object>> blends,
|
||||
AppContext context
|
||||
){
|
||||
List<SmsReadConfig> 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<PhoneVerify> 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<String, Object> 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<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, SupplierConfig>) 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<String, Map<String, Object>> blendsInclude = new ConfigCombineMapAdaptor<String, Map<String, Object>>();
|
||||
blendsInclude.putAll(this.blends);
|
||||
int num = 0;
|
||||
for (SmsReadConfig smsReadConfig : extendsSmsConfigs) {
|
||||
String key = SmsReadConfig.class.getSimpleName() + num;
|
||||
Map<String, Object> insideMap = new HashMap<>();
|
||||
insideMap.put(key, smsReadConfig);
|
||||
blendsInclude.put(key, insideMap);
|
||||
num++;
|
||||
}
|
||||
EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude);
|
||||
// 解析供应商配置
|
||||
for (String configId : blends.keySet()) {
|
||||
Map<String, Object> 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<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, org.dromara.sms4j.api.universal.SupplierConfig>) 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("加载内置运营商完成!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,52 +0,0 @@
|
||||
package org.dromara.sms4j.solon.config;
|
||||
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.provider.config.SmsConfig;
|
||||
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
|
||||
import org.noear.solon.annotation.Bean;
|
||||
import org.noear.solon.annotation.Condition;
|
||||
import org.noear.solon.annotation.Configuration;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
import org.noear.solon.core.AppContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* smsConfig参数意义为确保注入时smsConfig已经存在
|
||||
*/
|
||||
@Condition(onProperty = "${sms.configType}=yaml")
|
||||
@Configuration
|
||||
public class SupplierConfig {
|
||||
@Inject
|
||||
AppContext context;
|
||||
|
||||
private <T> T injectObj(String prefix, T obj) {
|
||||
//@Inject 只支持在字段、参数、类型上注入
|
||||
context.cfg().getProp(prefix).bindTo(obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
@Bean
|
||||
protected Map<String, Map<String, Object>> blends() {
|
||||
return injectObj("sms.blends", new LinkedHashMap<>());
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
protected SmsBlendsInitializer smsBlendsInitializer(List<BaseProviderFactory> factoryList,
|
||||
SmsConfig smsConfig,
|
||||
Map<String, Map<String, Object>> blends) {
|
||||
|
||||
//todo: solon 不支持泛型的 List[Bean] 注入
|
||||
List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList2 = new ArrayList<>(factoryList.size());
|
||||
for (BaseProviderFactory factory : factoryList) {
|
||||
factoryList2.add((BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>) factory);
|
||||
}
|
||||
|
||||
|
||||
return new SmsBlendsInitializer(factoryList2, smsConfig, blends, context);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
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;
|
||||
import org.noear.solon.annotation.Condition;
|
||||
import org.noear.solon.annotation.Configuration;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
import org.noear.solon.core.AppContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* smsConfig 参数意义为确保注入时 smsConfig 已经存在
|
||||
*/
|
||||
@Condition(onProperty = "${sms.configType}=yaml")
|
||||
@Configuration
|
||||
public class SupplierConfigure {
|
||||
@Inject
|
||||
AppContext context;
|
||||
|
||||
private <T> T injectObj(String prefix, T obj) {
|
||||
//@Inject 只支持在字段、参数、类型上注入
|
||||
context.cfg().getProp(prefix).bindTo(obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
@Bean("blends")
|
||||
@Condition(onProperty = "${sms.configType} = yaml")
|
||||
public Map<String, Map<String, Object>> blends() {
|
||||
return context.cfg().getProp("sms.blends").bindTo(new LinkedHashMap<>());
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Condition(onBean = SmsConfig.class)
|
||||
public List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList(
|
||||
@Inject("blends") Map<String, Map<String, Object>> blends,
|
||||
SmsConfig smsConfig) throws Exception {
|
||||
//注入自定义实现工厂
|
||||
List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList = new ArrayList<>();
|
||||
if (ConfigType.YAML.equals(smsConfig.getConfigType())) {
|
||||
for (String configId : blends.keySet()) {
|
||||
Map<String, Object> configMap = blends.get(configId);
|
||||
Object factoryPath = configMap.get(Constant.FACTORY_PATH);
|
||||
if (ObjectUtil.isNotEmpty(factoryPath)) {
|
||||
//反射创建实例
|
||||
Class<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> newClass = (Class<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>>) Class.forName(factoryPath.toString());
|
||||
BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig> factory = newClass.newInstance();
|
||||
factoryList.add(factory);
|
||||
}
|
||||
}
|
||||
}
|
||||
return factoryList;
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
public SmsBlendsInitializer smsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList,
|
||||
SmsConfig smsConfig,
|
||||
@Inject("blends") Map<String, Map<String, Object>> blends,
|
||||
@Inject(required = false) List<SmsReadConfig> extendsSmsConfigs) {
|
||||
if (extendsSmsConfigs == null) {
|
||||
extendsSmsConfigs = new ArrayList<>();
|
||||
}
|
||||
|
||||
return new SmsBlendsInitializer(factoryList, smsConfig, blends, extendsSmsConfigs);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,2 @@
|
||||
#???????
|
||||
solon.plugin=org.dromara.sms4j.solon.XPluginImpl
|
||||
#?????????????????0
|
||||
solon.plugin=org.dromara.sms4j.solon.Sms4jPlugin
|
||||
solon.plugin.priority=1
|
||||
Loading…
x
Reference in New Issue
Block a user