@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)@ResponseBodypublic ErrorResponseData bussiness(ServiceException e) {log.error("业务异常:", e);return new ErrorResponseData(e.getCode(), e.getMessage());}/*** 拦截权限异常*/@ExceptionHandler(PrivilegeException.class)@ResponseStatus(HttpStatus.FORBIDDEN)@ResponseBodypublic ErrorResponseData privilege(PrivilegeException e) {log.error("权限异常:", e);return new ErrorResponseData(e.getCode(), e.getMessage());}/*** 拦截未登录* @param e* @return*/@ExceptionHandler(AuthException.class)@ResponseStatus(HttpStatus.UNAUTHORIZED)@ResponseBodypublic ErrorResponseData auth(AuthException e) {log.error("登录异常:", e);return new ErrorResponseData(e.getCode(), e.getMessage());}/*** 拦截请求参数缺失*/@ExceptionHandler(MissingServletRequestParameterException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic ErrorResponseData badRequest(MissingServletRequestParameterException e) {log.error("业务异常:", e);return new ErrorResponseData("400", "缺少请求参数!");}@ExceptionHandler(HttpMessageNotReadableException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic ErrorResponseData jsonError(HttpMessageNotReadableException e) {log.error("业务异常:", e);return new ErrorResponseData("400", "缺少请求参数!");}/*** 校验错误拦截处理** @param exception 错误信息集合* @return 错误信息*/@ExceptionHandler(BindException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic ErrorResponseData notFount(RuntimeException e) {log.error("运行时异常:", e);return new ErrorResponseData(CoreExceptionEnum.SERVICE_ERROR.getCode(), CoreExceptionEnum.SERVICE_ERROR.getMsg());}}
_
