@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理
统一异常处理
需要配合@ExceptionHandler使用。
当将异常抛到controller时,可以对异常进行统一处理,规定返回的json格式或是跳转到一个错误页面
代码如下
*
* 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截) */
@ControllerAdvice
@Order(200)
public class DefaultExceptionHandler {
private Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 拦截业务异常
*/
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ErrorResponseData bussiness(ServiceException e) {
log.error("业务异常:", e);
return new ErrorResponseData(e.getCode(), e.getMessage());
}
/**
* 拦截权限异常
*/
@ExceptionHandler(PrivilegeException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
@ResponseBody
public ErrorResponseData privilege(PrivilegeException e) {
log.error("权限异常:", e);
return new ErrorResponseData(e.getCode(), e.getMessage());
}
/**
* 拦截未登录
* @param e
* @return
*/
@ExceptionHandler(AuthException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ResponseBody
public ErrorResponseData auth(AuthException e) {
log.error("登录异常:", e);
return new ErrorResponseData(e.getCode(), e.getMessage());
}
/**
* 拦截请求参数缺失
*/
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponseData badRequest(MissingServletRequestParameterException e) {
log.error("业务异常:", e);
return new ErrorResponseData("400", "缺少请求参数!");
}
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponseData jsonError(HttpMessageNotReadableException e) {
log.error("业务异常:", e);
return new ErrorResponseData("400", "缺少请求参数!");
}
/**
* 校验错误拦截处理
*
* @param exception 错误信息集合
* @return 错误信息
*/
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponseData validationBodyException(BindException exception){
BindingResult result = exception.getBindingResult();
return new ErrorResponseData("400", result.getFieldError() == null
? "请求参数有误" : result.getFieldError().getDefaultMessage());
}
/**
* 校验错误拦截处理
*
* @param exception 错误信息集合
* @return 错误信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponseData methodArgumentNotValidException(MethodArgumentNotValidException exception){
BindingResult result = exception.getBindingResult();
return new ErrorResponseData("400", result.getFieldError() == null
? "请求参数有误" : result.getFieldError().getDefaultMessage());
}
/**
* 拦截未知的运行时异常
*/
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ErrorResponseData notFount(RuntimeException e) {
log.error("运行时异常:", e);
return new ErrorResponseData(CoreExceptionEnum.SERVICE_ERROR.getCode(), CoreExceptionEnum.SERVICE_ERROR.getMsg());
}
}
_