错误说明:
1. 功能介绍:电商项目目前做到用户注册,想完成的异常处理是当用户名重复时,提示用户名重复错误。
2. 异常统一处理文件:新建GlobalExceptionHandler类,用来拦截Controller层抛出的异常,暂时有两个方法,方法1接受mallException处理业务异常,方法2接受Exception异常处理系统异常。
@ExceptionHandler(mallException.class)
@ResponseBody
public Object handServiceException(mallException e){
return ApiRestResponse.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handSystemException(Exception e){
return ApiRestResponse.error(mallExceptionEnum.SYSTEM_ERROR);
}
3. 错误点:接口测试重复用户名时,理论上应该执行业务异常处理方法,返回业务处理异常的提示,但执行的缺是系统异常处理方法 ,返回的是系统异常提示。
查找错误:
排查了Controller,Service层代码均未发生错误,debug显示Controller层抛出的也是mallException类型。
最后发现mallException类继承错误
源代码:public class mallException extends Throwable
更改后:public class mallException extends Exception
错误原因:
在 Java 中,Throwable
是所有错误和异常的父类,但在Spring的异常处理机制中,只有继承自 Exception
,或者更具体的继承自 RuntimeException
的异常才会被 @ExceptionHandler
处理。
注解学习:统一异常处理使用的几个常用注解
-
@ControllerAdvice
:这个注解是用来标注一个全局的异常处理类的,但它不包含@ResponseBody
的效果,也就是说,它可以同时适用于处理返回视图和返回JSON的方法。 -
@ExceptionHandler
:这个注解主要是标注一个方法,表示这个方法用来处理某一种(或多种)异常。这个方法的参数通常是一个或多个Exception
类、子类或者其他被检测的异常类型。如果这个方法有返回值,那么这个返回值会被@ResponseBody
处理。 -
@ResponseBody
:这个注解的作用是将方法返回的对象转化为JSON字符串,然后发送给客户端。这个昨天在Controller层开发的时候也用到了 -
还有一个更好的注解:
@RestControllerAdvice =@ControllerAdvice+@ResponseBody 用来标注全局的异常处理类,标注完以后就不用再每个方法上都标注@ResponseBody了。