From 5795c5e9a71c12ab40e1845e87c8ae55bbd2a036 Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 14 Jan 2023 17:23:56 +0800 Subject: [PATCH] feat:icanci:fix bug --- README.en.md | 36 ------ README.md | 33 ++--- .../admin/biz/service/AppConfigService.java | 2 +- .../biz/service/NoticeConfigService.java | 2 +- .../service/impl/AppConfigServiceImpl.java | 21 ++-- .../service/impl/NoticeConfigServiceImpl.java | 5 +- .../biz/service/impl/RegisterServiceImpl.java | 33 ++--- .../repository/DdkRepositoryHolder.java | 113 +++++++++++++----- .../ddk/client/repository/FieldHolderKey.java | 63 ++++++++++ .../loopstack/ddk/common/anno/DdkValue.java | 8 +- 10 files changed, 194 insertions(+), 122 deletions(-) delete mode 100644 README.en.md create mode 100644 client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolderKey.java diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 09bd1b3..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# DDK-动态字典键 - -#### Description -DDK-动态字典键,接入方只需要接入字典键SDK,即可以完成相关的通知更新功能。 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 2ca7b3d..1869991 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,28 @@ # DDK-动态字典键 #### 介绍 + DDK-动态字典键,接入方只需要接入字典键SDK,即可以完成相关的通知更新功能。 #### 软件架构 -软件架构说明 +软件架构说明 #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +1. xxxx +2. xxxx +3. xxxx #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +1. xxxx +2. xxxx +3. xxxx #### 参与贡献 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java index 8355c84..8bdee49 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java @@ -20,7 +20,7 @@ public interface AppConfigService { List loadSelector(); - List queryByAppUuid(String appUuid); + List queryByAppUuid(String appUuid,Integer isDelete); AppConfigVO queryByUuid(String uuid); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java index 4bb15fa..c953b53 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java @@ -19,5 +19,5 @@ public interface NoticeConfigService { List queryByNoticeConfigResource(String noticeConfigResource); - List queryByAppUuid(String appUuid); + List queryByAppUuid(String appUuid,Integer isDelete); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java index 048d387..a1a3dc1 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java @@ -1,5 +1,14 @@ package cn.icanci.loopstack.ddk.admin.biz.service.impl; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; + import cn.hutool.json.JSONUtil; import cn.icanci.loopstack.ddk.admin.biz.event.log.LogEvent; import cn.icanci.loopstack.ddk.admin.biz.mapping.config.AppConfigMapping; @@ -15,15 +24,6 @@ import cn.icanci.loopstack.ddk.common.model.TextValue; import cn.icanci.loopstack.ddk.common.model.config.AppConfigVO; import cn.icanci.loopstack.ddk.common.utils.PaginatorUtils; -import java.util.List; - -import javax.annotation.Resource; - -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Service; - -import com.google.common.collect.Lists; - /** * @author icanci * @since 1.0 Created in 2023/01/06 09:45 @@ -96,10 +96,11 @@ public class AppConfigServiceImpl extends BaseService implements Ap } @Override - public List queryByAppUuid(String appUuid) { + public List queryByAppUuid(String appUuid, Integer isDelete) { AppConfigDO appConfigDO = new AppConfigDO(); appConfigDO.setEnv(getEnv()); appConfigDO.setAppUuid(appUuid); + appConfigDO.setIsDelete(isDelete); List apps = appConfigMapper.selectList(appConfigDO); return appConfigMapping.dos2vos(apps); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java index 337ee23..df01998 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java @@ -6,7 +6,6 @@ import cn.icanci.loopstack.ddk.admin.biz.service.ExceptionHolder; import cn.icanci.loopstack.ddk.admin.biz.service.NoticeConfigService; import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.NoticeConfigDO; import cn.icanci.loopstack.ddk.admin.dal.mapper.mapper.NoticeConfigMapper; -import cn.icanci.loopstack.ddk.common.enums.BooleanEnum; import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.Paginator; import cn.icanci.loopstack.ddk.common.model.config.NoticeConfigVO; @@ -130,7 +129,7 @@ public class NoticeConfigServiceImpl extends BaseService impleme } @Override - public List queryByAppUuid(String appUuid) { - return noticeConfigMapping.dos2vos(noticeConfigMapper.queryByAppUuid(appUuid, BooleanEnum.NO.getCode(), getEnv())); + public List queryByAppUuid(String appUuid, Integer isDelete) { + return noticeConfigMapping.dos2vos(noticeConfigMapper.queryByAppUuid(appUuid, isDelete, getEnv())); } } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java index 80d65c1..bb362f9 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java @@ -1,5 +1,19 @@ package cn.icanci.loopstack.ddk.admin.biz.service.impl; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Set; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import cn.icanci.loopstack.ddk.admin.biz.event.dict.DictEvent; import cn.icanci.loopstack.ddk.admin.biz.event.resource.ResourceEvent; import cn.icanci.loopstack.ddk.admin.biz.mapping.config.RegisterMapping; @@ -9,6 +23,7 @@ import cn.icanci.loopstack.ddk.admin.biz.utils.EnvUtils; import cn.icanci.loopstack.ddk.admin.biz.utils.IDHolder; import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.RegisterDO; import cn.icanci.loopstack.ddk.admin.dal.mapper.mapper.RegisterMapper; +import cn.icanci.loopstack.ddk.common.enums.BooleanEnum; import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.config.*; import cn.icanci.loopstack.ddk.common.socket.load.DictValueObjectDTO; @@ -18,20 +33,6 @@ import cn.icanci.loopstack.ddk.common.socket.publish.RegisterDTO; import cn.icanci.loopstack.ddk.common.utils.PaginatorUtils; import cn.icanci.loopstack.lsi.event.EventDispatcher; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import javax.annotation.Resource; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - /** * @author icanci * @since 1.0 Created in 2023/01/06 21:07 @@ -141,7 +142,7 @@ public class RegisterServiceImpl implements RegisterService { AppVO appVO = appService.queryByAppId(appId); if (appVO != null) { String uuid = appVO.getUuid(); - List appConfigList = appConfigService.queryByAppUuid(uuid); + List appConfigList = appConfigService.queryByAppUuid(uuid, BooleanEnum.NO.getCode()); if (CollectionUtils.isNotEmpty(appConfigList)) { Set dictValues = Sets.newHashSet(); for (AppConfigVO appConfigVO : appConfigList) { @@ -150,7 +151,7 @@ public class RegisterServiceImpl implements RegisterService { response.setDictValues(dictValues); } - List noticeConfigList = noticeConfigService.queryByAppUuid(uuid); + List noticeConfigList = noticeConfigService.queryByAppUuid(uuid, BooleanEnum.NO.getCode()); if (CollectionUtils.isNotEmpty(noticeConfigList)) { Set resourceValues = Sets.newHashSet(); for (NoticeConfigVO noticeConfigVO : noticeConfigList) { diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java index eb5dbd5..d3742e7 100644 --- a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java @@ -52,45 +52,47 @@ import com.google.common.collect.Sets; @Service public class DdkRepositoryHolder implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(DdkRepositoryHolder.class); + private static final Logger logger = LoggerFactory.getLogger(DdkRepositoryHolder.class); - private static final Client CLIENT = HttpClientImpl.getInstance(); + private static final Client CLIENT = HttpClientImpl.getInstance(); @Resource - private DdkProperties ddkProperties; + private DdkProperties ddkProperties; @Resource - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - private static final String POUND_SIGN = "#"; + private static final String POUND_SIGN = "#"; /** * 字段支持处理的类型 */ - private static final Set> FIELD_SUPPORT_CLASS_TYPES = Sets.newHashSet(String.class, Integer.class, Long.class, Double.class, Float.class, - Boolean.class, Character.class, Short.class, Byte.class, BigDecimal.class); + private static final Set> FIELD_SUPPORT_CLASS_TYPES = Sets.newHashSet(String.class, Integer.class, int.class, Long.class, long.class, + Double.class, double.class, Float.class, float.class, Boolean.class, boolean.class, Character.class, char.class, Short.class, short.class, Byte.class, byte.class, + BigDecimal.class); /** * 字段支持处理的类型名字 */ - private static final String FIELD_SUPPORT_CLASS_TYPE_NAMES = String.join(",", - Sets.newHashSet(String.class.getName(), Integer.class.getName(), Long.class.getName(), Double.class.getName(), Float.class.getName(), Boolean.class.getName(), - Character.class.getName(), Short.class.getName(), Byte.class.getName(), BigDecimal.class.getName())); + private static final String FIELD_SUPPORT_CLASS_TYPE_NAMES = String.join(",", + Sets.newHashSet(String.class.getName(), Integer.class.getName(), int.class.getName(), Long.class.getName(), long.class.getName(), Double.class.getName(), + double.class.getName(), Float.class.getName(), float.class.getName(), Boolean.class.getName(), boolean.class.getName(), Character.class.getName(), char.class.getName(), + Short.class.getName(), short.class.getName(), Byte.class.getName(), byte.class.getName(), BigDecimal.class.getName())); /** * http://{address}:port+UriConstant.ToClient.LOAD */ - private static final String INVOKE_REQUEST_FORMAT = "http://%s:%s" + UriConstant.ToServer.LOAD; + private static final String INVOKE_REQUEST_FORMAT = "http://%s:%s" + UriConstant.ToServer.LOAD; /** * 字段map * key: 配置key * value: FieldHolder */ - private static final Map FIELD_MAP = new ConcurrentHashMap<>(); + private static final Map FIELD_MAP = new ConcurrentHashMap<>(); /** * 方法map * key: resource * value: MethodHolder */ - private static final Map METHOD_MAP = new ConcurrentHashMap<>(); + private static final Map METHOD_MAP = new ConcurrentHashMap<>(); @Override public void afterPropertiesSet() throws Exception { @@ -161,7 +163,7 @@ public class DdkRepositoryHolder implements InitializingBean { fieldHolder.setBean(bean); fieldHolder.setDdkKey(reallyValue); - FIELD_MAP.put(reallyValue, fieldHolder); + FIELD_MAP.put(new FieldHolderKey(reallyValue, clazz), fieldHolder); } } @@ -204,6 +206,10 @@ public class DdkRepositoryHolder implements InitializingBean { throw new DdkResourceIllegalityException("In Class: " + bean.getClass().getSimpleName() + ", the @DdkCall's Method is null! , Please Check it!"); } + MethodHolder repeat = METHOD_MAP.get(reallyResourceValue); + if (repeat != null) { + throw new DdkResourceIllegalityException("In Class: " + bean.getClass().getSimpleName() + ", the @DdkResource's value is repeat! , Please Check it!"); + } MethodHolder methodHolder = new MethodHolder(); methodHolder.setResource(reallyResourceValue); methodHolder.setValue(StringUtils.EMPTY); @@ -382,13 +388,14 @@ public class DdkRepositoryHolder implements InitializingBean { Map dictMap = dictValues.stream().collect(Collectors.toMap(DictValueObjectDTO::getKey, DictValueObjectDTO::getValue)); // 遍历客户端 - for (String key : FIELD_MAP.keySet()) { + for (FieldHolderKey fieldHolderKey : FIELD_MAP.keySet()) { + String key = fieldHolderKey.getKey(); String value = dictMap.get(key); if (StringUtils.isBlank(value)) { // 客户端有 && dictValues 没有,则无权限,抛出异常 throw new NoDdkAuthAccessException("The Client Project DDK dict '" + key + "' is not Empty, but call Form Server Result is Empty, Please check your it"); } - FieldHolder fieldHolder = FIELD_MAP.get(key); + FieldHolder fieldHolder = FIELD_MAP.get(fieldHolderKey); fieldHolder.setValue(value); // 字段后置处理 fieldPostProcessor(fieldHolder); @@ -416,43 +423,84 @@ public class DdkRepositoryHolder implements InitializingBean { } // Long 类型 if (Long.class.equals(fieldClass)) { - field.setLong(bean, Long.parseLong(value)); + field.set(bean, Long.parseLong(value)); + return; + } + // long 类型 + if (long.class.equals(fieldClass)) { + field.set(bean, Long.parseLong(value)); return; } // Double 类型 if (Double.class.equals(fieldClass)) { - field.setDouble(bean, Double.parseDouble(value)); + field.set(bean, Double.parseDouble(value)); + return; + } + // double 类型 + if (double.class.equals(fieldClass)) { + field.set(bean, Double.parseDouble(value)); return; } // Integer 类型 if (Integer.class.equals(fieldClass)) { - field.setInt(bean, Integer.parseInt(value)); + field.set(bean, Integer.parseInt(value)); + return; + } + // int 类型 + if (int.class.equals(fieldClass)) { + field.set(bean, Integer.parseInt(value)); return; } // Float if (Float.class.equals(fieldClass)) { - field.setFloat(bean, Float.parseFloat(value)); + field.set(bean, Float.parseFloat(value)); + return; + } + // float + if (float.class.equals(fieldClass)) { + field.set(bean, Float.parseFloat(value)); return; } // Boolean if (Boolean.class.equals(fieldClass)) { - field.setBoolean(bean, Boolean.parseBoolean(value)); + field.set(bean, Boolean.parseBoolean(value)); + return; + } + // boolean + if (boolean.class.equals(fieldClass)) { + field.set(bean, Boolean.parseBoolean(value)); return; } // Character if (Character.class.equals(fieldClass)) { // Character 只取0 - field.setChar(bean, value.charAt(0)); + field.set(bean, value.charAt(0)); + return; + } + // char + if (char.class.equals(fieldClass)) { + // Character 只取0 + field.set(bean, value.charAt(0)); return; } // Short if (Short.class.equals(fieldClass)) { - field.setShort(bean, Short.parseShort(value)); + field.set(bean, Short.parseShort(value)); + return; + } + // short + if (short.class.equals(fieldClass)) { + field.set(bean, Short.parseShort(value)); return; } // Byte if (Byte.class.equals(fieldClass)) { - field.setShort(bean, Byte.parseByte(value)); + field.set(bean, Byte.parseByte(value)); + return; + } + // byte + if (byte.class.equals(fieldClass)) { + field.set(bean, Byte.parseByte(value)); return; } // BigDecimal @@ -533,14 +581,17 @@ public class DdkRepositoryHolder implements InitializingBean { if (publish == null || StringUtils.isBlank(publish.getKey()) || StringUtils.isBlank(publish.getValue())) { throw new DdkValueIllegalityException("refresh field error! the PublishValueRefreshDTO is not right"); } - FieldHolder fieldHolder = FIELD_MAP.get(publish.getKey()); - if (fieldHolder == null) { - logger.info("[DdkRepositoryHolder][refresh] not need refresh! key:{},value:{}", publish.getKey(), publish.getValue()); - return; - } - fieldHolder.setValue(publish.getValue()); + Set targetKeys = FIELD_MAP.keySet().stream().filter(key -> StringUtils.equals(key.getKey(), publish.getKey())).collect(Collectors.toSet()); + for (FieldHolderKey targetKey : targetKeys) { + FieldHolder fieldHolder = FIELD_MAP.get(targetKey); + if (fieldHolder == null) { + logger.info("[DdkRepositoryHolder][refresh] not need refresh! key:{},value:{}", publish.getKey(), publish.getValue()); + return; + } + fieldHolder.setValue(publish.getValue()); - fieldPostProcessor(fieldHolder); + fieldPostProcessor(fieldHolder); + } } /** diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolderKey.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolderKey.java new file mode 100644 index 0000000..648ab11 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolderKey.java @@ -0,0 +1,63 @@ +package cn.icanci.loopstack.ddk.client.repository; + +import java.util.Objects; +import java.util.StringJoiner; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/14 17:06 + */ +public class FieldHolderKey { + /** + * key + */ + private String key; + /** + * 需要映射的类型 + */ + private Class clazz; + + public FieldHolderKey() { + } + + public FieldHolderKey(String key, Class clazz) { + this.key = key; + this.clazz = clazz; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + FieldHolderKey that = (FieldHolderKey) o; + return Objects.equals(key, that.key) && Objects.equals(clazz, that.clazz); + } + + @Override + public int hashCode() { + return Objects.hash(key, clazz); + } + + @Override + public String toString() { + return new StringJoiner(",").add("key=" + key).add("clazz=" + clazz).toString(); + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java b/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java index 3b04146..da92d96 100644 --- a/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java +++ b/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java @@ -16,9 +16,11 @@ import java.lang.annotation.Target; public @interface DdkValue { /** * 配置字典值 - * 支持注入的类型:@Type {String.class, Integer.class, Long.class, Double.class, Float.class, - * Boolean.class, Character.class, Short.class, Byte.class, BigDecimal.class} - * 注入值的方式 @DdkValue("#url") + * 支持注入的类型:@Type {String.class, Integer.class, int.class, Long.class, long.class, Double.class, + * double.class, Float.class, float.class, Boolean.class, boolean.class, Character.class, + * char.class, Short.class, short.class, Byte.class, byte.class, BigDecimal.class} + * + * 注入值的方式 @DdkValue("#key") * @return 返回配置字典值 */ String value(); -- Gitee