在spring 3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档
从注解的名很清楚的知道,该注解是一个面向切面编程的用于controller方法增强的注解,@ControllerAdvice的实现:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
}
-
@ControllerAdvice详解
先看以下代码:
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model
*/
@ModelAttribute
public void newUser() {
}
/**
* 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
}
/**
* 应用到所有@RequestMapping注解的方法,在其抛出BusinessException异常时执行
*/
@ExceptionHandler(BusinessException.class)
@ResponseBody
public ApiResult<String> businessExceptionHandler(HttpServletRequest req, BusinessException e) throws Exception {
ApiResult<String> apiResult = new ApiResult<>();
apiResult.fail(e.getMessage());
return apiResult;
}
}
使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法,都会作用于使用@RequestMapping注解的方法上。
-
自定义统一异常处理
1.编写自定义异常类:
public class BusinessException extends RuntimeException {
public BusinessException() {
super();
}
public BusinessException(String message) {
super(message);
}
}
2.编写全局异常处理类:
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Log logger = LogFactory.getLog(GlobalExceptionHandler.class);
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public ApiResult<String> businessExceptionHandler(HttpServletRequest req, BusinessException e) throws Exception {
ApiResult<String> apiResult = new ApiResult<>();
apiResult.fail(e.getMessage());
return apiResult;
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ApiResult<String> exceptionHandler(HttpServletRequest req, Exception e) throws Exception {
ApiResult<String> apiResult = new ApiResult<>();
logger.error(e.getMessage(), e);
apiResult.dataError();
return apiResult;
}
}
通过以上代码编写之后,只要是使用@RequestMapping注解的方法,抛出BusinessException和Exception都会自动统一调用businessExceptionHandler和exceptionHandler方法,进行异常处理。