修改 Dubbo Exception Filter 的处理,针对系统异常,还是直接抛出

pull/3/head
YunaiV 2020-07-19 03:55:44 +08:00
parent c0407267b9
commit e04c9584e3
2 changed files with 21 additions and 20 deletions

View File

@ -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);
}

View File

@ -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);
}