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; package org.dromara.sms4j.solon;
import org.dromara.sms4j.solon.config.SmsAutowiredConfig; import org.dromara.sms4j.solon.configuration.SmsAutowiredConfiguration;
import org.dromara.sms4j.solon.config.SupplierConfig; import org.dromara.sms4j.solon.configuration.SupplierConfiguration;
import org.noear.solon.core.AppContext; import org.noear.solon.core.AppContext;
import org.noear.solon.core.Plugin; import org.noear.solon.core.Plugin;
@ -11,7 +11,7 @@ import org.noear.solon.core.Plugin;
public class XPluginImpl implements Plugin { public class XPluginImpl implements Plugin {
@Override @Override
public void start(AppContext context) { public void start(AppContext context) {
context.beanMake(SmsAutowiredConfig.class); context.beanMake(SmsAutowiredConfiguration.class);
context.beanMake(SupplierConfig.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 lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.constant.Constant;
@ -16,7 +16,7 @@ import java.util.concurrent.Executor;
@Slf4j @Slf4j
@Configuration @Configuration
public class SmsAutowiredConfig implements LifecycleBean { public class SmsAutowiredConfiguration implements LifecycleBean {
@Inject @Inject
AppContext context; 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.core.util.StrUtil;
import cn.hutool.json.JSONObject; 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.api.SmsBlend;
import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.config.SmsConfig;
@ -18,7 +18,7 @@ import java.util.Map;
*/ */
@Condition(onProperty = "${sms.configType}=config_file") @Condition(onProperty = "${sms.configType}=config_file")
@Configuration @Configuration
public class SupplierConfig { public class SupplierConfiguration {
@Inject @Inject
AppContext context; AppContext context;

View File

@ -4,8 +4,9 @@ sms:
# 账户上限 # 账户上限
account-max: 1 account-max: 1
blends: blends:
alibaba:
# 阿里短信例子 # 阿里短信例子
ali: ali1:
#厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 #厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: alibaba supplier: alibaba
#您的accessKey #您的accessKey
@ -18,7 +19,21 @@ sms:
template-id: SMS_272470496 template-id: SMS_272470496
# 模版名称 # 模版名称
templateName: code 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: tx:
#厂商标识 #厂商标识
supplier: tencent supplier: tencent
@ -33,6 +48,7 @@ sms:
#您的sdkAppId #您的sdkAppId
sdk-app-id: 1400761645 sdk-app-id: 1400761645
# 华为短信例子 # 华为短信例子
huawei:
hw: hw:
#厂商标识 #厂商标识
supplier: huawei supplier: huawei
@ -51,6 +67,7 @@ sms:
# 通道号 # 通道号
sender: 8823040504797 sender: 8823040504797
# 合一短信例子 # 合一短信例子
unisms:
uni: uni:
#厂商标识 #厂商标识
supplier: unisms supplier: unisms
@ -64,6 +81,7 @@ sms:
templateName: code templateName: code
# 渠道上限 # 渠道上限
maximum: 2 maximum: 2
lianlu:
lianlu: lianlu:
supplier: lianlu supplier: lianlu
templateId: 模板id templateId: 模板id
@ -71,6 +89,7 @@ sms:
appKey: d42d7 appKey: d42d7
mchId: 100 mchId: 100
signName: 【test】 signName: 【test】
cloopen:
cloopen: cloopen:
# 短信厂商 # 短信厂商
supplier: cloopen supplier: cloopen
@ -86,6 +105,7 @@ sms:
# appId: 64c52d2a****77775fe72e3 # appId: 64c52d2a****77775fe72e3
# sid: d2a****777 # sid: d2a****777
# url: https://sms.idowe.com/**/**/**/send # url: https://sms.idowe.com/**/**/**/send
qiniu:
qiniu: qiniu:
access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2 access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2
access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1 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 @Test
public void byLoadTest() { 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.core.util.StrUtil;
import cn.hutool.json.JSONObject; 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 lombok.Data;
import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.constant.Constant;
@ -17,7 +17,7 @@ import org.springframework.core.env.Environment;
@Data @Data
public class SmsMainConfig { public class SmsMainConfiguration {
@Bean @Bean
public SmsSpringUtils smsSpringUtil(DefaultListableBeanFactory defaultListableBeanFactory){ 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.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.enumerate.ConfigType; import org.dromara.sms4j.comm.enumerate.ConfigType;
import org.dromara.sms4j.core.datainterface.SmsReadConfig; 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.config.SmsConfig;
import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.starter.config.*;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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 org.springframework.context.annotation.Bean;
import java.util.ArrayList; import java.lang.reflect.Field;
import java.util.LinkedHashMap; import java.util.*;
import java.util.List;
import java.util.Map;
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 @Bean
@ConfigurationProperties(prefix = "sms.blends")
@ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "yaml") @ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "yaml")
protected Map<String, Map<String, Object>> blends() { @SneakyThrows
return new LinkedHashMap<>(); 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 @Bean

View File

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

View File

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