_

@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理

统一异常处理
需要配合@ExceptionHandler使用。
当将异常抛到controller时,可以对异常进行统一处理,规定返回的json格式或是跳转到一个错误页面

代码如下

  1. *
  2. * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截) */
  3. @ControllerAdvice
  4. @Order(200)
  5. public class DefaultExceptionHandler {
  6. private Logger log = LoggerFactory.getLogger(this.getClass());
  7. /**
  8. * 拦截业务异常
  9. */
  10. @ExceptionHandler(ServiceException.class)
  11. @ResponseStatus(HttpStatus.OK)
  12. @ResponseBody
  13. public ErrorResponseData bussiness(ServiceException e) {
  14. log.error("业务异常:", e);
  15. return new ErrorResponseData(e.getCode(), e.getMessage());
  16. }
  17. /**
  18. * 拦截权限异常
  19. */
  20. @ExceptionHandler(PrivilegeException.class)
  21. @ResponseStatus(HttpStatus.FORBIDDEN)
  22. @ResponseBody
  23. public ErrorResponseData privilege(PrivilegeException e) {
  24. log.error("权限异常:", e);
  25. return new ErrorResponseData(e.getCode(), e.getMessage());
  26. }
  27. /**
  28. * 拦截未登录
  29. * @param e
  30. * @return
  31. */
  32. @ExceptionHandler(AuthException.class)
  33. @ResponseStatus(HttpStatus.UNAUTHORIZED)
  34. @ResponseBody
  35. public ErrorResponseData auth(AuthException e) {
  36. log.error("登录异常:", e);
  37. return new ErrorResponseData(e.getCode(), e.getMessage());
  38. }
  39. /**
  40. * 拦截请求参数缺失
  41. */
  42. @ExceptionHandler(MissingServletRequestParameterException.class)
  43. @ResponseStatus(HttpStatus.BAD_REQUEST)
  44. @ResponseBody
  45. public ErrorResponseData badRequest(MissingServletRequestParameterException e) {
  46. log.error("业务异常:", e);
  47. return new ErrorResponseData("400", "缺少请求参数!");
  48. }
  49. @ExceptionHandler(HttpMessageNotReadableException.class)
  50. @ResponseStatus(HttpStatus.BAD_REQUEST)
  51. @ResponseBody
  52. public ErrorResponseData jsonError(HttpMessageNotReadableException e) {
  53. log.error("业务异常:", e);
  54. return new ErrorResponseData("400", "缺少请求参数!");
  55. }
  56. /**
  57. * 校验错误拦截处理
  58. *
  59. * @param exception 错误信息集合
  60. * @return 错误信息
  61. */
  62. @ExceptionHandler(BindException.class)
  63. @ResponseStatus(HttpStatus.BAD_REQUEST)
  64. @ResponseBody
  65. public ErrorResponseData validationBodyException(BindException exception){
  66. BindingResult result = exception.getBindingResult();
  67. return new ErrorResponseData("400", result.getFieldError() == null
  68. ? "请求参数有误" : result.getFieldError().getDefaultMessage());
  69. }
  70. /**
  71. * 校验错误拦截处理
  72. *
  73. * @param exception 错误信息集合
  74. * @return 错误信息
  75. */
  76. @ExceptionHandler(MethodArgumentNotValidException.class)
  77. @ResponseStatus(HttpStatus.BAD_REQUEST)
  78. @ResponseBody
  79. public ErrorResponseData methodArgumentNotValidException(MethodArgumentNotValidException exception){
  80. BindingResult result = exception.getBindingResult();
  81. return new ErrorResponseData("400", result.getFieldError() == null
  82. ? "请求参数有误" : result.getFieldError().getDefaultMessage());
  83. }
  84. /**
  85. * 拦截未知的运行时异常
  86. */
  87. @ExceptionHandler(RuntimeException.class)
  88. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  89. @ResponseBody
  90. public ErrorResponseData notFount(RuntimeException e) {
  91. log.error("运行时异常:", e);
  92. return new ErrorResponseData(CoreExceptionEnum.SERVICE_ERROR.getCode(), CoreExceptionEnum.SERVICE_ERROR.getMsg());
  93. }
  94. }

_