Commit 5bd631636310789779e2409e45937fb242fef055
1 parent
e973a436
refactor(error-code): 修改为框架定义接口,modules实现
Showing
5 changed files
with
170 additions
and
143 deletions
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeAutoConfiguration.java
| 1 | package cn.iocoder.dashboard.framework.errorcode.config; | 1 | package cn.iocoder.dashboard.framework.errorcode.config; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeRemoteLoader; | 3 | +import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeRemoteLoaderImpl; |
| 4 | +import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeAutoGeneratorImpl; | ||
| 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; | 5 | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| 5 | import org.springframework.context.annotation.Bean; | 6 | import org.springframework.context.annotation.Bean; |
| 6 | import org.springframework.context.annotation.Configuration; | 7 | import org.springframework.context.annotation.Configuration; |
| @@ -12,14 +13,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; | @@ -12,14 +13,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; | ||
| 12 | public class ErrorCodeAutoConfiguration { | 13 | public class ErrorCodeAutoConfiguration { |
| 13 | 14 | ||
| 14 | @Bean | 15 | @Bean |
| 15 | - public cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeAutoGenerator errorCodeAutoGenerator(ErrorCodeProperties errorCodeProperties) { | ||
| 16 | - return new cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeAutoGenerator(errorCodeProperties.getGroup()) | 16 | + public ErrorCodeAutoGeneratorImpl errorCodeAutoGenerator(ErrorCodeProperties errorCodeProperties) { |
| 17 | + return new ErrorCodeAutoGeneratorImpl(errorCodeProperties.getGroup()) | ||
| 17 | .setErrorCodeConstantsClass(errorCodeProperties.getConstantsClass()); | 18 | .setErrorCodeConstantsClass(errorCodeProperties.getConstantsClass()); |
| 18 | } | 19 | } |
| 19 | 20 | ||
| 20 | @Bean | 21 | @Bean |
| 21 | - public ErrorCodeRemoteLoader errorCodeRemoteLoader(ErrorCodeProperties errorCodeProperties) { | ||
| 22 | - return new ErrorCodeRemoteLoader(errorCodeProperties.getGroup()); | 22 | + public ErrorCodeRemoteLoaderImpl errorCodeRemoteLoader(ErrorCodeProperties errorCodeProperties) { |
| 23 | + return new ErrorCodeRemoteLoaderImpl(errorCodeProperties.getGroup()); | ||
| 23 | } | 24 | } |
| 24 | 25 | ||
| 25 | } | 26 | } |
| 26 | \ No newline at end of file | 27 | \ No newline at end of file |
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/ErrorCodeAutoGenerator.java
| 1 | package cn.iocoder.dashboard.framework.errorcode.core; | 1 | package cn.iocoder.dashboard.framework.errorcode.core; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.common.exception.ErrorCode; | ||
| 4 | -import cn.iocoder.dashboard.common.pojo.CommonResult; | ||
| 5 | -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; | ||
| 6 | -import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeService; | ||
| 7 | -import lombok.extern.slf4j.Slf4j; | ||
| 8 | -import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
| 9 | -import org.springframework.context.event.EventListener; | ||
| 10 | -import org.springframework.scheduling.annotation.Async; | ||
| 11 | -import org.springframework.util.StringUtils; | ||
| 12 | - | ||
| 13 | -import javax.annotation.Resource; | ||
| 14 | -import java.util.ArrayList; | ||
| 15 | -import java.util.Arrays; | ||
| 16 | -import java.util.List; | ||
| 17 | - | ||
| 18 | -@Slf4j | ||
| 19 | -public class ErrorCodeAutoGenerator { | 3 | +/** |
| 4 | + * @author dylan | ||
| 5 | + */ | ||
| 6 | +public interface ErrorCodeAutoGenerator { | ||
| 20 | 7 | ||
| 21 | /** | 8 | /** |
| 22 | - * 应用分组 | 9 | + * 将配置类到错误码写入数据库 |
| 23 | */ | 10 | */ |
| 24 | - private final String group; | ||
| 25 | - /** | ||
| 26 | - * 错误码枚举类 | ||
| 27 | - */ | ||
| 28 | - private String errorCodeConstantsClass; | ||
| 29 | - | ||
| 30 | - @Resource | ||
| 31 | - private ErrorCodeService errorCodeService; | ||
| 32 | - | ||
| 33 | - public ErrorCodeAutoGenerator(String group) { | ||
| 34 | - this.group = group; | ||
| 35 | - } | ||
| 36 | - | ||
| 37 | - public ErrorCodeAutoGenerator setErrorCodeConstantsClass(String errorCodeConstantsClass) { | ||
| 38 | - this.errorCodeConstantsClass = errorCodeConstantsClass; | ||
| 39 | - return this; | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - @EventListener(ApplicationReadyEvent.class) | ||
| 43 | - @Async // 异步,保证项目的启动过程,毕竟非关键流程 | ||
| 44 | - public void execute() { | ||
| 45 | - // 校验 errorCodeConstantsClass 参数 | ||
| 46 | - if (!StringUtils.hasText(errorCodeConstantsClass)) { | ||
| 47 | - log.info("[execute][未配置 yudao.error-code.constants-class 配置项,不进行自动写入到当前服务中]"); | ||
| 48 | - return; | ||
| 49 | - } | ||
| 50 | - Class errorCodeConstantsClazz; | ||
| 51 | - try { | ||
| 52 | - errorCodeConstantsClazz = Class.forName(errorCodeConstantsClass); | ||
| 53 | - } catch (ClassNotFoundException e) { | ||
| 54 | - log.error("[execute][配置的 ({}) 找不到对应的类]", errorCodeConstantsClass); | ||
| 55 | - return; | ||
| 56 | - } | ||
| 57 | - // 写入 system-service 服务 | ||
| 58 | - log.info("[execute][自动将 ({}) 类的错误码,准备写入到当前服务]", errorCodeConstantsClass); | ||
| 59 | - List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs = new ArrayList<>(); | ||
| 60 | - Arrays.stream(errorCodeConstantsClazz.getFields()).forEach(field -> { | ||
| 61 | - if (field.getType() != ErrorCode.class) { | ||
| 62 | - return; | ||
| 63 | - } | ||
| 64 | - try { | ||
| 65 | - // TODO 芋艿:校验是否重复了; | ||
| 66 | - ErrorCode errorCode = (ErrorCode) field.get(errorCodeConstantsClazz); | ||
| 67 | - autoGenerateDTOs.add(new ErrorCodeAutoGenerateDTO().setGroup(group) | ||
| 68 | - .setCode(errorCode.getCode()).setMessage(errorCode.getMessage())); | ||
| 69 | - } catch (IllegalAccessException e) { | ||
| 70 | - throw new RuntimeException(e); | ||
| 71 | - } | ||
| 72 | - }); | ||
| 73 | - CommonResult<Boolean> autoGenerateErrorCodesResult = errorCodeService.autoGenerateErrorCodes1(autoGenerateDTOs); | ||
| 74 | - if (autoGenerateErrorCodesResult.isSuccess()) { | ||
| 75 | - log.info("[execute][自动将 ({}) 类的错误码,成功写入到当前服务]", errorCodeConstantsClass); | ||
| 76 | - } else { | ||
| 77 | - log.error("[execute][自动将 ({}) 类的错误码,失败写入到当前服务,原因为 ({}/{})]", errorCodeConstantsClass, | ||
| 78 | - autoGenerateErrorCodesResult.getCode(), autoGenerateErrorCodesResult.getMsg()); | ||
| 79 | - } | ||
| 80 | - } | ||
| 81 | - | 11 | + void execute(); |
| 82 | } | 12 | } |
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/ErrorCodeRemoteLoader.java
| 1 | package cn.iocoder.dashboard.framework.errorcode.core; | 1 | package cn.iocoder.dashboard.framework.errorcode.core; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollUtil; | ||
| 4 | -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; | ||
| 5 | -import cn.iocoder.dashboard.common.pojo.CommonResult; | ||
| 6 | -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; | ||
| 7 | -import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeService; | ||
| 8 | -import cn.iocoder.dashboard.util.date.DateUtils; | ||
| 9 | -import lombok.extern.slf4j.Slf4j; | ||
| 10 | -import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
| 11 | -import org.springframework.context.event.EventListener; | ||
| 12 | -import org.springframework.scheduling.annotation.Scheduled; | ||
| 13 | - | ||
| 14 | -import javax.annotation.Resource; | ||
| 15 | -import java.util.Date; | ||
| 16 | -import java.util.List; | ||
| 17 | - | ||
| 18 | -@Slf4j | ||
| 19 | -public class ErrorCodeRemoteLoader { | ||
| 20 | - | ||
| 21 | - private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; | 3 | +public interface ErrorCodeRemoteLoader { |
| 22 | 4 | ||
| 23 | /** | 5 | /** |
| 24 | - * 应用分组 | 6 | + * 全量加载 ErrorCode 错误码 |
| 25 | */ | 7 | */ |
| 26 | - private final String group; | ||
| 27 | - | ||
| 28 | - @Resource | ||
| 29 | - private ErrorCodeService errorCodeService; | ||
| 30 | - | ||
| 31 | - private Date maxUpdateTime; | ||
| 32 | - | ||
| 33 | - public ErrorCodeRemoteLoader(String group) { | ||
| 34 | - this.group = group; | ||
| 35 | - } | ||
| 36 | - | ||
| 37 | - @EventListener(ApplicationReadyEvent.class) | ||
| 38 | - public void loadErrorCodes() { | ||
| 39 | - // 从 ErrorCodeRpc 全量加载 ErrorCode 错误码 | ||
| 40 | - CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, null); | ||
| 41 | - listErrorCodesResult.checkError(); | ||
| 42 | - log.info("[loadErrorCodes][从 group({}) 全量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size()); | ||
| 43 | - // 写入到 ServiceExceptionUtil 到 | ||
| 44 | - listErrorCodesResult.getData().forEach(errorCodeVO -> { | ||
| 45 | - ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage()); | ||
| 46 | - // 记录下更新时间,方便增量更新 | ||
| 47 | - maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime()); | ||
| 48 | - }); | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) | ||
| 52 | - public void refreshErrorCodes() { | ||
| 53 | - // 从 ErrorCodeRpc 增量加载 ErrorCode 错误码 | ||
| 54 | - // TODO 优化点:假设删除错误码的配置,会存在问题; | ||
| 55 | - CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, maxUpdateTime); | ||
| 56 | - listErrorCodesResult.checkError(); | ||
| 57 | - if (CollUtil.isEmpty(listErrorCodesResult.getData())) { | ||
| 58 | - return; | ||
| 59 | - } | ||
| 60 | - log.info("[refreshErrorCodes][从 group({}) 增量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size()); | ||
| 61 | - // 写入到 ServiceExceptionUtil 到 | ||
| 62 | - listErrorCodesResult.getData().forEach(errorCodeVO -> { | ||
| 63 | - ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage()); | ||
| 64 | - // 记录下更新时间,方便增量更新 | ||
| 65 | - maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime()); | ||
| 66 | - }); | ||
| 67 | - } | 8 | + void loadErrorCodes(); |
| 68 | 9 | ||
| 10 | + /** | ||
| 11 | + * 增量加载 ErrorCode 错误码 | ||
| 12 | + */ | ||
| 13 | + void refreshErrorCodes(); | ||
| 69 | } | 14 | } |
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/ErrorCodeAutoGeneratorImpl.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.service.errorcode; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.dashboard.common.exception.ErrorCode; | ||
| 4 | +import cn.iocoder.dashboard.common.pojo.CommonResult; | ||
| 5 | +import cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeAutoGenerator; | ||
| 6 | +import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; | ||
| 7 | +import lombok.RequiredArgsConstructor; | ||
| 8 | +import lombok.extern.slf4j.Slf4j; | ||
| 9 | +import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
| 10 | +import org.springframework.context.event.EventListener; | ||
| 11 | +import org.springframework.scheduling.annotation.Async; | ||
| 12 | +import org.springframework.util.StringUtils; | ||
| 13 | + | ||
| 14 | +import javax.annotation.Resource; | ||
| 15 | +import java.util.ArrayList; | ||
| 16 | +import java.util.Arrays; | ||
| 17 | +import java.util.List; | ||
| 18 | + | ||
| 19 | +@RequiredArgsConstructor | ||
| 20 | +@Slf4j | ||
| 21 | +public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * 应用分组 | ||
| 25 | + */ | ||
| 26 | + private final String group; | ||
| 27 | + /** | ||
| 28 | + * 错误码枚举类 | ||
| 29 | + */ | ||
| 30 | + private String errorCodeConstantsClass; | ||
| 31 | + | ||
| 32 | + @Resource | ||
| 33 | + private ErrorCodeService errorCodeService; | ||
| 34 | + | ||
| 35 | + public ErrorCodeAutoGeneratorImpl setErrorCodeConstantsClass(String errorCodeConstantsClass) { | ||
| 36 | + this.errorCodeConstantsClass = errorCodeConstantsClass; | ||
| 37 | + return this; | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + @EventListener(ApplicationReadyEvent.class) | ||
| 42 | + @Async // 异步,保证项目的启动过程,毕竟非关键流程 | ||
| 43 | + public void execute() { | ||
| 44 | + // 校验 errorCodeConstantsClass 参数 | ||
| 45 | + if (!StringUtils.hasText(errorCodeConstantsClass)) { | ||
| 46 | + log.info("[execute][未配置 yudao.error-code.constants-class 配置项,不进行自动写入到当前服务中]"); | ||
| 47 | + return; | ||
| 48 | + } | ||
| 49 | + Class errorCodeConstantsClazz; | ||
| 50 | + try { | ||
| 51 | + errorCodeConstantsClazz = Class.forName(errorCodeConstantsClass); | ||
| 52 | + } catch (ClassNotFoundException e) { | ||
| 53 | + log.error("[execute][配置的 ({}) 找不到对应的类]", errorCodeConstantsClass); | ||
| 54 | + return; | ||
| 55 | + } | ||
| 56 | + // 写入 system-service 服务 | ||
| 57 | + log.info("[execute][自动将 ({}) 类的错误码,准备写入到当前服务]", errorCodeConstantsClass); | ||
| 58 | + List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs = new ArrayList<>(); | ||
| 59 | + Arrays.stream(errorCodeConstantsClazz.getFields()).forEach(field -> { | ||
| 60 | + if (field.getType() != ErrorCode.class) { | ||
| 61 | + return; | ||
| 62 | + } | ||
| 63 | + try { | ||
| 64 | + ErrorCode errorCode = (ErrorCode) field.get(errorCodeConstantsClazz); | ||
| 65 | + autoGenerateDTOs.add(new ErrorCodeAutoGenerateDTO().setGroup(group) | ||
| 66 | + .setCode(errorCode.getCode()).setMessage(errorCode.getMessage())); | ||
| 67 | + } catch (IllegalAccessException e) { | ||
| 68 | + throw new RuntimeException(e); | ||
| 69 | + } | ||
| 70 | + }); | ||
| 71 | + CommonResult<Boolean> autoGenerateErrorCodesResult = errorCodeService.autoGenerateErrorCodes1(autoGenerateDTOs); | ||
| 72 | + if (autoGenerateErrorCodesResult.isSuccess()) { | ||
| 73 | + log.info("[execute][自动将 ({}) 类的错误码,成功写入到当前服务]", errorCodeConstantsClass); | ||
| 74 | + } else { | ||
| 75 | + log.error("[execute][自动将 ({}) 类的错误码,失败写入到当前服务,原因为 ({}/{})]", errorCodeConstantsClass, | ||
| 76 | + autoGenerateErrorCodesResult.getCode(), autoGenerateErrorCodesResult.getMsg()); | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | +} |
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/ErrorCodeRemoteLoaderImpl.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.service.errorcode; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; | ||
| 5 | +import cn.iocoder.dashboard.common.pojo.CommonResult; | ||
| 6 | +import cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeRemoteLoader; | ||
| 7 | +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; | ||
| 8 | +import cn.iocoder.dashboard.util.date.DateUtils; | ||
| 9 | +import lombok.extern.slf4j.Slf4j; | ||
| 10 | +import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
| 11 | +import org.springframework.context.event.EventListener; | ||
| 12 | +import org.springframework.scheduling.annotation.Scheduled; | ||
| 13 | + | ||
| 14 | +import javax.annotation.Resource; | ||
| 15 | +import java.util.Date; | ||
| 16 | +import java.util.List; | ||
| 17 | + | ||
| 18 | +@Slf4j | ||
| 19 | +public class ErrorCodeRemoteLoaderImpl implements ErrorCodeRemoteLoader { | ||
| 20 | + | ||
| 21 | + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * 应用分组 | ||
| 25 | + */ | ||
| 26 | + private final String group; | ||
| 27 | + | ||
| 28 | + @Resource | ||
| 29 | + private ErrorCodeService errorCodeService; | ||
| 30 | + | ||
| 31 | + private Date maxUpdateTime; | ||
| 32 | + | ||
| 33 | + public ErrorCodeRemoteLoaderImpl(String group) { | ||
| 34 | + this.group = group; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @Override | ||
| 38 | + @EventListener(ApplicationReadyEvent.class) | ||
| 39 | + public void loadErrorCodes() { | ||
| 40 | + // 从 ErrorCodeRpc 全量加载 ErrorCode 错误码 | ||
| 41 | + CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, null); | ||
| 42 | + listErrorCodesResult.checkError(); | ||
| 43 | + log.info("[loadErrorCodes][从 group({}) 全量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size()); | ||
| 44 | + // 写入到 ServiceExceptionUtil 到 | ||
| 45 | + listErrorCodesResult.getData().forEach(errorCodeVO -> { | ||
| 46 | + ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage()); | ||
| 47 | + // 记录下更新时间,方便增量更新 | ||
| 48 | + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime()); | ||
| 49 | + }); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) | ||
| 54 | + public void refreshErrorCodes() { | ||
| 55 | + // 从 ErrorCodeRpc 增量加载 ErrorCode 错误码 | ||
| 56 | + // TODO 优化点:假设删除错误码的配置,会存在问题; | ||
| 57 | + CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, maxUpdateTime); | ||
| 58 | + listErrorCodesResult.checkError(); | ||
| 59 | + if (CollUtil.isEmpty(listErrorCodesResult.getData())) { | ||
| 60 | + return; | ||
| 61 | + } | ||
| 62 | + log.info("[refreshErrorCodes][从 group({}) 增量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size()); | ||
| 63 | + // 写入到 ServiceExceptionUtil 到 | ||
| 64 | + listErrorCodesResult.getData().forEach(errorCodeVO -> { | ||
| 65 | + ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage()); | ||
| 66 | + // 记录下更新时间,方便增量更新 | ||
| 67 | + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime()); | ||
| 68 | + }); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | +} |