修改 Dubbo Exception Filter 的处理,针对系统异常,还是直接抛出
This commit is contained in:
parent
c0407267b9
commit
e04c9584e3
@ -15,7 +15,8 @@ import javax.validation.ConstraintViolation;
|
||||
import javax.validation.ConstraintViolationException;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import static cn.iocoder.common.framework.exception.enums.GlobalErrorCodeConstants.*;
|
||||
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)
|
||||
public class DubboProviderExceptionFilter implements Filter, Filter.Listener {
|
||||
@ -31,30 +32,24 @@ public class DubboProviderExceptionFilter implements Filter, Filter.Listener {
|
||||
public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
|
||||
if (appResponse.hasException() && GenericService.class != invoker.getInterface()) {
|
||||
try {
|
||||
// 转换异常
|
||||
// 1. 转换异常
|
||||
Throwable exception = appResponse.getException();
|
||||
// 1. 参数校验异常
|
||||
// 1.1 参数校验异常
|
||||
if (exception instanceof ConstraintViolationException) {
|
||||
exception = this.constraintViolationExceptionHandler((ConstraintViolationException) exception);
|
||||
// 2. ServiceException 业务异常,因为不会有序列化问题,所以无需处理
|
||||
// 1. ServiceException 业务异常,因为不会有序列化问题,所以无需处理
|
||||
} else if (exception instanceof ServiceException) {
|
||||
// 3. 其它异常,转换成 ServiceException 业务异常,避免可能存在的反序列化问题
|
||||
// 1.3 其它异常,转换成 ServiceException 业务异常,避免可能存在的反序列化问题
|
||||
} else {
|
||||
exception = this.defaultExceptionHandler(exception, invocation);
|
||||
assert exception != null;
|
||||
}
|
||||
// 根据不同的方法 schema 返回结果
|
||||
// 第一种情况,返回参数类型是 CommonResult 的情况,则将 ServiceException 转换成 CommonResult
|
||||
if (isReturnCommonResult(invocation)) {
|
||||
// 清空异常
|
||||
appResponse.setException(null);
|
||||
// 设置结果
|
||||
if (exception instanceof ServiceException) {
|
||||
appResponse.setValue(CommonResult.error((ServiceException) exception));
|
||||
} else {
|
||||
appResponse.setValue(CommonResult.error((GlobalException) exception));
|
||||
}
|
||||
// 第二种情况,未包装成 CommonResult 的情况,则直接抛出 ServiceException 异常
|
||||
// 2. 根据不同的方法 schema 返回结果
|
||||
// 2.1 如果是 ServiceException 异常,并且返回参数类型是 CommonResult 的情况,则将转换成 CommonResult 返回
|
||||
if (isReturnCommonResult(invocation) && exception instanceof ServiceException) {
|
||||
appResponse.setException(null); // 一定要清空异常
|
||||
appResponse.setValue(CommonResult.error((ServiceException) exception));
|
||||
// 2.2 如果是 GlobalException 全局异常,则直接抛出
|
||||
} else {
|
||||
appResponse.setException(exception);
|
||||
}
|
||||
|
@ -160,9 +160,15 @@ public class GlobalExceptionHandler {
|
||||
*/
|
||||
@ExceptionHandler(value = GlobalException.class)
|
||||
public CommonResult globalExceptionHandler(HttpServletRequest req, GlobalException ex) {
|
||||
logger.error("[globalExceptionHandler]", ex);
|
||||
// 插入异常日志
|
||||
this.createExceptionLog(req, ex);
|
||||
// 系统异常时,才打印异常日志
|
||||
if (INTERNAL_SERVER_ERROR.getCode().equals(ex.getCode())) {
|
||||
logger.error("[globalExceptionHandler]", ex);
|
||||
// 插入异常日志
|
||||
this.createExceptionLog(req, ex);
|
||||
// 普通全局异常,打印 info 日志即可
|
||||
} else {
|
||||
logger.info("[globalExceptionHandler]", ex);
|
||||
}
|
||||
// 返回 ERROR CommonResult
|
||||
return CommonResult.error(ex);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user