1.修改名称,区分配置类和配置项

2.修复,各厂商配置差异,原方案无法很好的提供配置提示的问题
3.优化后,用户可自行写自己的配置,并加载到Spring 容器中,具体写法参考AbstractMultiConfig,
内部可自动加载用户定义的配置,且用户配置也可以自动提示
This commit is contained in:
suyouliang 2024-05-17 15:58:00 +08:00
parent 5cca342043
commit fc3cbc9e2f
27 changed files with 492 additions and 114 deletions

View File

@ -1,7 +1,7 @@
package org.dromara.sms4j.solon;
import org.dromara.sms4j.solon.config.SmsAutowiredConfig;
import org.dromara.sms4j.solon.config.SupplierConfig;
import org.dromara.sms4j.solon.configuration.SmsAutowiredConfiguration;
import org.dromara.sms4j.solon.configuration.SupplierConfiguration;
import org.noear.solon.core.AppContext;
import org.noear.solon.core.Plugin;
@ -11,7 +11,7 @@ import org.noear.solon.core.Plugin;
public class XPluginImpl implements Plugin {
@Override
public void start(AppContext context) {
context.beanMake(SmsAutowiredConfig.class);
context.beanMake(SupplierConfig.class);
context.beanMake(SmsAutowiredConfiguration.class);
context.beanMake(SupplierConfiguration.class);
}
}

View File

@ -1,4 +1,4 @@
package org.dromara.sms4j.solon.config;
package org.dromara.sms4j.solon.configuration;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.comm.constant.Constant;
@ -16,7 +16,7 @@ import java.util.concurrent.Executor;
@Slf4j
@Configuration
public class SmsAutowiredConfig implements LifecycleBean {
public class SmsAutowiredConfiguration implements LifecycleBean {
@Inject
AppContext context;

View File

@ -1,4 +1,4 @@
package org.dromara.sms4j.solon.config;
package org.dromara.sms4j.solon.configuration;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;

View File

@ -1,4 +1,4 @@
package org.dromara.sms4j.solon.config;
package org.dromara.sms4j.solon.configuration;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.provider.config.SmsConfig;
@ -18,7 +18,7 @@ import java.util.Map;
*/
@Condition(onProperty = "${sms.configType}=config_file")
@Configuration
public class SupplierConfig {
public class SupplierConfiguration {
@Inject
AppContext context;

View File

@ -4,8 +4,9 @@ sms:
# 账户上限
account-max: 1
blends:
alibaba:
# 阿里短信例子
ali:
ali1:
#厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: alibaba
#您的accessKey
@ -18,7 +19,21 @@ sms:
template-id: SMS_272470496
# 模版名称
templateName: code
# 腾讯短信例子
ali2:
#厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: alibaba
#您的accessKey
access-key-id: 您的accessKey
#您的accessKeySecret
access-key-secret: 您的accessKeySecret
#您的短信签名
signature: 测试签名
#模板ID 非必须配置如果使用sendMessage的快速发送需此配置
template-id: SMS_272470496
# 模版名称
templateName: code
# 腾讯短信例子:
tencent:
tx:
#厂商标识
supplier: tencent
@ -33,6 +48,7 @@ sms:
#您的sdkAppId
sdk-app-id: 1400761645
# 华为短信例子
huawei:
hw:
#厂商标识
supplier: huawei
@ -51,6 +67,7 @@ sms:
# 通道号
sender: 8823040504797
# 合一短信例子
unisms:
uni:
#厂商标识
supplier: unisms
@ -64,6 +81,7 @@ sms:
templateName: code
# 渠道上限
maximum: 2
lianlu:
lianlu:
supplier: lianlu
templateId: 模板id
@ -71,6 +89,7 @@ sms:
appKey: d42d7
mchId: 100
signName: 【test】
cloopen:
cloopen:
# 短信厂商
supplier: cloopen
@ -86,6 +105,7 @@ sms:
# appId: 64c52d2a****77775fe72e3
# sid: d2a****777
# url: https://sms.idowe.com/**/**/**/send
qiniu:
qiniu:
access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2
access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1

View File

@ -26,7 +26,7 @@ class Sms4jTest {
/**
* 填测试手机号
*/
private static final String PHONE = "";
private static final String PHONE = "18988889999";
@Test
public void byLoadTest() {

View File

@ -0,0 +1,7 @@
package org.dromara.sms4j.starter.config;
import org.dromara.sms4j.provider.config.BaseConfig;
public abstract class AbstractMultiConfig<T extends BaseConfig> {
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class AlibabaMultiConfig extends AbstractMultiConfig<AlibabaConfig> {
Map<String, AlibabaConfig> alibaba;
}

View File

@ -0,0 +1,21 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.cloopen.config.CloopenConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class CloopenMultiConfig extends AbstractMultiConfig<AlibabaConfig> {
Map<String, CloopenConfig> cloopen;
}

View File

@ -0,0 +1,21 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.ctyun.config.CtyunConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class CtyunMultiConfig extends AbstractMultiConfig<AlibabaConfig> {
Map<String, CtyunConfig> ctyun;
}

View File

@ -0,0 +1,21 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class DingzhongMultiConfig extends AbstractMultiConfig<AlibabaConfig> {
Map<String, DingZhongConfig> dingzhong;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.emay.config.EmayConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class EmayMultiConfig extends AbstractMultiConfig<EmayConfig> {
Map<String, EmayConfig> emay;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.huawei.config.HuaweiConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class HuaweiMultiConfig extends AbstractMultiConfig<HuaweiConfig> {
Map<String, HuaweiConfig> huawei;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.jdcloud.config.JdCloudConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class JdcloudMultiConfig extends AbstractMultiConfig<JdCloudConfig> {
Map<String, JdCloudConfig> jdcloud;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.lianlu.config.LianLuConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class LianluMultiConfig extends AbstractMultiConfig<LianLuConfig> {
Map<String, LianLuConfig> lianlu;
}

View File

@ -0,0 +1,45 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.cloopen.config.CloopenConfig;
import org.dromara.sms4j.ctyun.config.CtyunConfig;
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
import org.dromara.sms4j.emay.config.EmayConfig;
import org.dromara.sms4j.huawei.config.HuaweiConfig;
import org.dromara.sms4j.jdcloud.config.JdCloudConfig;
import org.dromara.sms4j.lianlu.config.LianLuConfig;
import org.dromara.sms4j.netease.config.NeteaseConfig;
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
import org.dromara.sms4j.tencent.config.TencentConfig;
import org.dromara.sms4j.unisms.config.UniConfig;
import org.dromara.sms4j.yunpian.config.YunpianConfig;
import org.dromara.sms4j.zhutong.config.ZhutongConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class MultiAccountConfig {
AbstractMultiConfig<AlibabaConfig> alibaba;
AbstractMultiConfig<CloopenConfig> cloopen;
AbstractMultiConfig<CtyunConfig> ctyun;
AbstractMultiConfig<DingZhongConfig> dingzhong;
AbstractMultiConfig<EmayConfig> emay;
AbstractMultiConfig<HuaweiConfig> huawei;
AbstractMultiConfig<JdCloudConfig> jdcloud;
AbstractMultiConfig<LianLuConfig> lianlu;
AbstractMultiConfig<NeteaseConfig> netease;
AbstractMultiConfig<QiNiuConfig> qiniu;
AbstractMultiConfig<TencentConfig> tencent;
AbstractMultiConfig<UniConfig> unisms;
AbstractMultiConfig<YunpianConfig> yunpian;
AbstractMultiConfig<ZhutongConfig> zhutong;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.netease.config.NeteaseConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class NeteaseMultiConfig extends AbstractMultiConfig<NeteaseConfig> {
Map<String, NeteaseConfig> netease;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class QiniuMultiConfig extends AbstractMultiConfig<QiNiuConfig> {
Map<String, QiNiuConfig> qiniu;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.tencent.config.TencentConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class TencentMultiConfig extends AbstractMultiConfig<TencentConfig> {
Map<String, TencentConfig> tencent;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.unisms.config.UniConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class UnismsMultiConfig extends AbstractMultiConfig<UniConfig> {
Map<String, UniConfig> unisms;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.yunpian.config.YunpianConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class YunpianMultiConfig extends AbstractMultiConfig<YunpianConfig> {
Map<String, YunpianConfig> yunpian;
}

View File

@ -0,0 +1,20 @@
package org.dromara.sms4j.starter.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.zhutong.config.ZhutongConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Map;
/**
* 此写法主要解决:由于定义抽象的ConfigMap定义,Spring boot 配置文件无法给予友好提示的问题
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties("sms.blends")
public class ZhutongMultiConfig extends AbstractMultiConfig<ZhutongConfig> {
Map<String, ZhutongConfig> zhutong;
}

View File

@ -1,4 +1,4 @@
package org.dromara.sms4j.starter.config;
package org.dromara.sms4j.starter.configration;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;

View File

@ -1,4 +1,4 @@
package org.dromara.sms4j.starter.config;
package org.dromara.sms4j.starter.configration;
import lombok.Data;
import org.dromara.sms4j.comm.constant.Constant;
@ -17,7 +17,7 @@ import org.springframework.core.env.Environment;
@Data
public class SmsMainConfig {
public class SmsMainConfiguration {
@Bean
public SmsSpringUtils smsSpringUtil(DefaultListableBeanFactory defaultListableBeanFactory){

View File

@ -1,34 +1,57 @@
package org.dromara.sms4j.starter.config;
package org.dromara.sms4j.starter.configration;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.SneakyThrows;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.enumerate.ConfigType;
import org.dromara.sms4j.core.datainterface.SmsReadConfig;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.dromara.sms4j.provider.config.SmsConfig;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.starter.config.*;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.lang.reflect.Field;
import java.util.*;
public class SupplierConfig {
@EnableConfigurationProperties({AlibabaMultiConfig.class, CloopenMultiConfig.class, CtyunMultiConfig.class, DingzhongMultiConfig.class
, EmayMultiConfig.class, HuaweiMultiConfig.class, JdcloudMultiConfig.class, LianluMultiConfig.class, NeteaseMultiConfig.class
, QiniuMultiConfig.class, TencentMultiConfig.class, UnismsMultiConfig.class, YunpianMultiConfig.class, ZhutongMultiConfig.class})
public class SupplierConfiguration {
/**
* 注入配置
*/
@Bean
@ConfigurationProperties(prefix = "sms.blends")
@ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "yaml")
protected Map<String, Map<String, Object>> blends() {
return new LinkedHashMap<>();
@SneakyThrows
private Map<String, Map<String, Object>> blends(List<AbstractMultiConfig<?>> blends) {
Map<String, Map<String, Object>> blendsMap = new HashMap<>();
for (AbstractMultiConfig<?> blend : blends) {
Field[] declaredFields = blend.getClass().getDeclaredFields();
Optional<Field> first = Arrays.stream(declaredFields).filter(field -> field.getType().isAssignableFrom(Map.class)).findFirst();
if (first.isPresent()) {
Field field = first.get();
field.setAccessible(Boolean.TRUE);
Map<String, ? extends BaseConfig> configMap = (Map) field.get(blend);
if (Objects.isNull(configMap)) {
continue;
}
for (String configId : configMap.keySet()) {
BaseConfig config = configMap.get(configId);
//将实体转换为单独属性,兼容原逻辑,更改最小
Map<String, Object> fieldConfigMap = JSONUtil.parseObj(config).toBean(new TypeReference<Map<String, Object>>() {
});
blendsMap.put(configId, fieldConfigMap);
}
}
}
return blendsMap;
}
@Bean

View File

@ -1,3 +1,3 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.dromara.sms4j.starter.config.SmsMainConfig,\
org.dromara.sms4j.starter.config.SupplierConfig
org.dromara.sms4j.starter.configration.SmsMainConfiguration,\
org.dromara.sms4j.starter.configration.SupplierConfiguration

View File

@ -1,2 +1,2 @@
org.dromara.sms4j.starter.config.SmsMainConfig
org.dromara.sms4j.starter.config.SupplierConfig
org.dromara.sms4j.starter.configration.SmsMainConfiguration
org.dromara.sms4j.starter.configration.SupplierConfiguration