Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
0df486a6
提交
0df486a6
authored
7月 19, 2020
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
错误码的 Starter 的初始化,暂未完成
上级
e04c9584
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
254 行增加
和
2 行删除
+254
-2
DubboProviderExceptionFilter.java
.../mall/dubbo/core/filter/DubboProviderExceptionFilter.java
+2
-2
pom.xml
common/mall-spring-boot-starter-system-error-code/pom.xml
+46
-0
ErrorCodeAutoConfiguration.java
...l/system/errorcode/config/ErrorCodeAutoConfiguration.java
+18
-0
ErrorCodeProperties.java
...der/mall/system/errorcode/config/ErrorCodeProperties.java
+34
-0
ErrorCodeAutoGenerator.java
...er/mall/system/errorcode/core/ErrorCodeAutoGenerator.java
+76
-0
ErrorCodeRemoteLoader.java
...der/mall/system/errorcode/core/ErrorCodeRemoteLoader.java
+75
-0
spring.factories
...m-error-code/src/main/resources/META-INF/spring.factories
+2
-0
pom.xml
common/pom.xml
+1
-0
没有可用的文件名
+0
-0
没有找到文件。
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/filter/DubboProviderExceptionFilter.java
浏览文件 @
0df486a6
...
...
@@ -18,7 +18,7 @@ import java.lang.reflect.Type;
import
static
cn
.
iocoder
.
common
.
framework
.
exception
.
enums
.
GlobalErrorCodeConstants
.
BAD_REQUEST
;
import
static
cn
.
iocoder
.
common
.
framework
.
exception
.
enums
.
GlobalErrorCodeConstants
.
INTERNAL_SERVER_ERROR
;
@Activate
(
group
=
CommonConstants
.
PROVIDER
)
@Activate
(
group
=
CommonConstants
.
PROVIDER
)
// TODO 优化点:设置下顺序
public
class
DubboProviderExceptionFilter
implements
Filter
,
Filter
.
Listener
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
DubboProviderExceptionFilter
.
class
);
...
...
@@ -39,7 +39,7 @@ public class DubboProviderExceptionFilter implements Filter, Filter.Listener {
exception
=
this
.
constraintViolationExceptionHandler
((
ConstraintViolationException
)
exception
);
// 1. ServiceException 业务异常,因为不会有序列化问题,所以无需处理
}
else
if
(
exception
instanceof
ServiceException
)
{
// 1.3 其它异常,转换成
ServiceException 业务
异常,避免可能存在的反序列化问题
// 1.3 其它异常,转换成
GlobalException 全局
异常,避免可能存在的反序列化问题
}
else
{
exception
=
this
.
defaultExceptionHandler
(
exception
,
invocation
);
assert
exception
!=
null
;
...
...
common/mall-spring-boot-starter-system-error-code/pom.xml
0 → 100644
浏览文件 @
0df486a6
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
common
</artifactId>
<groupId>
cn.iocoder.mall
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
mall-spring-boot-starter-system-error-code
</artifactId>
<description>
错误码 ErrorCode 的自动配置功能,提供如下功能:
1. 远程读取:项目启动时,从 system-service 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置;
2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-service 服务加载最新的 ErrorCode 错误码;
3. 自动写入:项目启动时,将项目本地的错误码写到 system-service 服务中,方便管理员在管理后台编辑;
</description>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
system-service-api
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<!-- Spring 核心 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<optional>
true
</optional>
</dependency>
<!-- RPC 相关 -->
<dependency>
<groupId>
org.apache.dubbo
</groupId>
<artifactId>
dubbo
</artifactId>
</dependency>
</dependencies>
</project>
common/mall-spring-boot-starter-system-error-code/src/main/java/cn/iocoder/mall/system/errorcode/config/ErrorCodeAutoConfiguration.java
0 → 100644
浏览文件 @
0df486a6
package
cn
.
iocoder
.
mall
.
system
.
errorcode
.
config
;
import
cn.iocoder.mall.system.errorcode.core.ErrorCodeAutoGenerator
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
@EnableConfigurationProperties
(
ErrorCodeProperties
.
class
)
public
class
ErrorCodeAutoConfiguration
{
@Bean
public
ErrorCodeAutoGenerator
errorCodeAutoGenerator
(
ErrorCodeProperties
errorCodeProperties
)
{
return
new
ErrorCodeAutoGenerator
(
errorCodeProperties
.
getGroup
())
.
setErrorCodeConstantsClass
(
errorCodeProperties
.
getConstantsClass
());
}
}
common/mall-spring-boot-starter-system-error-code/src/main/java/cn/iocoder/mall/system/errorcode/config/ErrorCodeProperties.java
0 → 100644
浏览文件 @
0df486a6
package
cn
.
iocoder
.
mall
.
system
.
errorcode
.
config
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
@ConfigurationProperties
(
"mall.error-code"
)
public
class
ErrorCodeProperties
{
/**
* 应用分组
*/
private
String
group
;
/**
* 错误码枚举类
*/
private
String
constantsClass
;
public
String
getGroup
()
{
return
group
;
}
public
ErrorCodeProperties
setGroup
(
String
group
)
{
this
.
group
=
group
;
return
this
;
}
public
String
getConstantsClass
()
{
return
constantsClass
;
}
public
ErrorCodeProperties
setConstantsClass
(
String
constantsClass
)
{
this
.
constantsClass
=
constantsClass
;
return
this
;
}
}
common/mall-spring-boot-starter-system-error-code/src/main/java/cn/iocoder/mall/system/errorcode/core/ErrorCodeAutoGenerator.java
0 → 100644
浏览文件 @
0df486a6
package
cn
.
iocoder
.
mall
.
system
.
errorcode
.
core
;
import
cn.iocoder.common.framework.exception.ErrorCode
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.systemservice.rpc.errorcode.dto.ErrorCodeAutoGenerateDTO
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.boot.context.event.ApplicationReadyEvent
;
import
org.springframework.context.event.EventListener
;
import
org.springframework.scheduling.annotation.Async
;
import
java.lang.reflect.Field
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.function.Consumer
;
public
class
ErrorCodeAutoGenerator
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
ErrorCodeAutoGenerator
.
class
);
/**
* 应用分组
*/
private
final
String
group
;
/**
* 错误码枚举类
*/
private
String
errorCodeConstantsClass
;
public
ErrorCodeAutoGenerator
(
String
group
)
{
this
.
group
=
group
;
}
public
ErrorCodeAutoGenerator
setErrorCodeConstantsClass
(
String
errorCodeConstantsClass
)
{
this
.
errorCodeConstantsClass
=
errorCodeConstantsClass
;
return
this
;
}
@EventListener
(
ApplicationReadyEvent
.
class
)
@Async
// 异步,保证项目的启动过程,毕竟非关键流程
public
void
execute
()
{
// 校验 errorCodeConstantsClass 参数
if
(!
StringUtils
.
hasText
(
errorCodeConstantsClass
))
{
logger
.
info
(
"[execute][未配置 mall.error-code.constants-class 配置项,不进行自动写入到 system-service 服务]"
);
return
;
}
Class
errorCodeConstantsClazz
;
try
{
errorCodeConstantsClazz
=
Class
.
forName
(
errorCodeConstantsClass
);
}
catch
(
ClassNotFoundException
e
)
{
logger
.
error
(
"[execute][配置的 ({}) 找不到对应的类]"
,
errorCodeConstantsClass
);
return
;
}
// 写入 system-service 服务
logger
.
info
(
"[execute][自动将 ({}) 类的错误码,准备写入到 system-service 服务]"
,
errorCodeConstantsClass
);
List
<
ErrorCodeAutoGenerateDTO
>
autoGenerateDTO
=
new
ArrayList
<>();
Arrays
.
stream
(
errorCodeConstantsClazz
.
getFields
()).
forEach
(
new
Consumer
<
Field
>()
{
@Override
public
void
accept
(
Field
field
)
{
if
(
field
.
getType
()
!=
ErrorCode
.
class
)
{
return
;
}
try
{
ErrorCode
errorCode
=
(
ErrorCode
)
field
.
get
(
errorCodeConstantsClazz
);
autoGenerateDTO
.
add
(
new
ErrorCodeAutoGenerateDTO
().
setGroup
(
group
)
.
setCode
(
errorCode
.
getCode
()).
setMessage
(
errorCode
.
getMessage
()));
}
catch
(
IllegalAccessException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
});
logger
.
info
(
"[execute][自动将 ({}) 类的错误码,完成写入到 system-service 服务]"
,
errorCodeConstantsClass
);
}
}
common/mall-spring-boot-starter-system-error-code/src/main/java/cn/iocoder/mall/system/errorcode/core/ErrorCodeRemoteLoader.java
0 → 100644
浏览文件 @
0df486a6
package
cn
.
iocoder
.
mall
.
system
.
errorcode
.
core
;
import
cn.iocoder.common.framework.util.ServiceExceptionUtil
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.mall.systemservice.rpc.errorcode.ErrorCodeRpc
;
import
cn.iocoder.mall.systemservice.rpc.errorcode.vo.ErrorCodeVO
;
import
org.apache.dubbo.config.annotation.Reference
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.boot.context.event.ApplicationReadyEvent
;
import
org.springframework.context.event.EventListener
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
java.util.Date
;
import
java.util.List
;
public
class
ErrorCodeRemoteLoader
{
private
static
final
int
REFRESH_ERROR_CODE_PERIOD
=
60
*
1000
;
private
Logger
logger
=
LoggerFactory
.
getLogger
(
ErrorCodeRemoteLoader
.
class
);
/**
* 应用分组
*/
private
final
String
group
;
@Reference
(
version
=
"${dubbo.consumer.ErrorCodeRpc.version}"
)
private
ErrorCodeRpc
errorCodeRpc
;
private
Date
maxUpdateTime
;
public
ErrorCodeRemoteLoader
(
String
group
)
{
this
.
group
=
group
;
}
@EventListener
(
ApplicationReadyEvent
.
class
)
public
void
loadErrorCodes
()
{
// 从 ErrorCodeRpc 加载 ErrorCode 错误码
CommonResult
<
List
<
ErrorCodeVO
>>
listErrorCodesResult
=
errorCodeRpc
.
listErrorCodes
(
group
,
null
);
listErrorCodesResult
.
checkError
();
logger
.
info
(
"[loadErrorCodes][从 group({}) 全量加载到 {} 个 ErrorCode 错误码]"
,
group
,
listErrorCodesResult
.
getData
().
size
());
// 写入到 ServiceExceptionUtil 到
listErrorCodesResult
.
getData
().
forEach
(
errorCodeVO
->
{
ServiceExceptionUtil
.
put
(
errorCodeVO
.
getCode
(),
errorCodeVO
.
getMessage
());
// 记录下更新时间,方便增量更新
maxUpdateTime
=
max
(
maxUpdateTime
,
errorCodeVO
.
getUpdateTime
());
});
}
@Scheduled
(
fixedDelay
=
REFRESH_ERROR_CODE_PERIOD
)
public
void
refreshErrorCodes
()
{
// 从 ErrorCodeRpc 加载 ErrorCode 错误码
CommonResult
<
List
<
ErrorCodeVO
>>
listErrorCodesResult
=
errorCodeRpc
.
listErrorCodes
(
group
,
maxUpdateTime
);
listErrorCodesResult
.
checkError
();
logger
.
info
(
"[refreshErrorCodes][从 group({}) 增量加载到 {} 个 ErrorCode 错误码]"
,
group
,
listErrorCodesResult
.
getData
().
size
());
// 写入到 ServiceExceptionUtil 到
listErrorCodesResult
.
getData
().
forEach
(
errorCodeVO
->
{
ServiceExceptionUtil
.
put
(
errorCodeVO
.
getCode
(),
errorCodeVO
.
getMessage
());
// 记录下更新时间,方便增量更新
maxUpdateTime
=
max
(
maxUpdateTime
,
errorCodeVO
.
getUpdateTime
());
});
}
private
static
Date
max
(
Date
a
,
Date
b
)
{
if
(
a
==
null
)
{
return
b
;
}
if
(
b
==
null
)
{
return
a
;
}
return
a
.
compareTo
(
b
)
>
0
?
a
:
b
;
}
}
common/mall-spring-boot-starter-system-error-code/src/main/resources/META-INF/spring.factories
0 → 100644
浏览文件 @
0df486a6
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.iocoder.mall.system.errorcode.config.ErrorCodeAutoConfiguration
common/pom.xml
浏览文件 @
0df486a6
...
...
@@ -21,6 +21,7 @@
<module>
mall-spring-boot-starter-security-user
</module>
<module>
mall-spring-boot-starter-mybatis
</module>
<module>
mall-spring-boot-starter-dubbo
</module>
<module>
mall-spring-boot-starter-system-error-code
</module>
</modules>
<dependencyManagement>
...
...
浏览文件 @
0df486a6
No preview for this file type
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论