问题发生场景
自定义了个全局异常拦截:
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { // private static final Logger logger = LoggerFactory.getLogger(ExceptionControllerAdvice.class); @Autowired private HttpServletRequest req; private Result failure(ServiceException exception) { return Result.buildFailure(req.getHeader(CommonConstant.X_REQUEST_ID), exception.getCode(), exception.getMessage(), req.getHeader(CommonConstant.X_TOKEN_ISSUER)); } //手动抛出的业务异常 @ExceptionHandler(ServiceException.class) public Result serviceExceptionHandler(ServiceException e) { return failure(e); } //省略其他异常 }
参数校验
@Data @TableName("export_task_torque") public class ExportTaskTorque extends BaseEntity { /** * 任务id */ @TableId @NotBlank(message = "任务id不能为空", groups = {UpdateGroup.class}) private String taskId; /** * 任务名称 */ @NotBlank(message = "任务名称不能为空", groups = {AddGroup.class}) private String taskName; /** * 开始时间 */ @NotBlank(message = "开始时间不能为空", groups = {AddGroup.class}) private String startTime; /** * 结束时间 */ @NotBlank(message = "结束时间不能为空", groups = {AddGroup.class}) private String endTime; /** }
service层校验
public String add(ExportTaskTorque exportTaskTorque) { //hibernate-validtor校验入参 ValidatorUtils.validateEntity(exportTaskTorque, AddGroup.class); //省略其他代码 }
请求
运行结果:
没有显示我的业务异常:,讲道理应该有参数校验信息:
问题排查和定位
发现这个是被一个全局出入参数打印的aop给处理了。
虽然这个方法写了throws Throwable,但是try catch了。异常没有被抛出。
解决
解决方法就是把上面的try catch 去掉,一定记得保留throws Throwable
再次请求:
可以看到手动的参数校验异常显示了,问题解决!
其他场景
小编之前还遇到过一种不能抛出全局异常的情况, 经过排查,是一个同事,修改了统一结果返回的公司基础core包。
统一返回结果:
抛出异常地方
有这个构造方法,向外传递异常。
问题出在,一个哥们把这个构造方法重构了,(>_<) !!经过沟通,让同事修改后,问题解决。