使用SpringBoot内置的@ControllerAdvice@ExceptionHandler进行异常处理:

    • @ControllerAdvice:使用该注解即表示开启全局异常捕获,可自定义basePackages,用于标示异常捕获范围;
    • @ExceptionHandler:定义捕获异常的类型

    Asuka中预置了GlobalExceptionHandler,捕获com.asuka包内的异常。

    1. @ControllerAdvice(basePackages = "com.asuka")
    2. public class GlobalExceptionHandler {
    3. private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    4. @ExceptionHandler(BusinessException.class)
    5. public String businessExceptionHandler(BusinessException ex, HttpServletRequest request, HttpServletResponse response){
    6. logger.error(ex.getMessage(), ex);
    7. return doHandler("error/500.html", 500, ex.getMessage(), ex.toString(), request, response);
    8. }
    9. @ExceptionHandler(AccessDeniedException.class)
    10. public String AccessDeniedException(AccessDeniedException ex, HttpServletRequest request, HttpServletResponse response) {
    11. return doHandler("error/403.html", 403, ex.getMessage(), ex.toString(), request, response);
    12. }
    13. @ExceptionHandler(AuthenticationException.class)
    14. public String AuthenticationException(AuthenticationException ex, HttpServletRequest request, HttpServletResponse response) {
    15. return doHandler("error/403.html", 403, ex.getMessage(), ex.toString(), request, response);
    16. }
    17. @ExceptionHandler(IllegalArgumentException.class)
    18. public String IllegalArgumentException(IllegalArgumentException ex, HttpServletRequest request, HttpServletResponse response) {
    19. return doHandler("error/500.html", Constants.RESULT_ERROR_CODE, ex.getMessage(), ex.toString(), request, response);
    20. }
    21. @ExceptionHandler(NullPointerException.class)
    22. public String NullPointerException(NullPointerException ex, HttpServletRequest request, HttpServletResponse response) {
    23. logger.error(ex.getMessage(), ex);
    24. return doHandler("error/500.html", Constants.RESULT_ERROR_CODE, ex.getMessage(), ex.toString(), request, response);
    25. }
    26. @ExceptionHandler(Exception.class)
    27. public String errorHandler(Exception ex, HttpServletRequest request, HttpServletResponse response) {
    28. logger.error(ex.getMessage(), ex);
    29. if (ex instanceof IException) {
    30. return doHandler("error/500.html", ((IException) ex).getCode(), ex.getMessage(), ex.toString(), request, response);
    31. }
    32. return doHandler("error/500.html", Constants.RESULT_ERROR_CODE, "系统错误", ex.toString(), request, response);
    33. }
    34. /**
    35. * 处理错误,ajax返回json,非ajax跳转页面
    36. */
    37. private String doHandler(String url, Integer code, String msg, String error, HttpServletRequest request, HttpServletResponse response) {
    38. if (isAjax(request)) {
    39. cross(response); // 支持跨域
    40. response.setContentType("application/json;charset=utf-8");
    41. try {
    42. PrintWriter out = response.getWriter();
    43. out.write(JSON.toJSONString(JsonResult.error(code, msg).put("error", error)));
    44. out.flush();
    45. out.close();
    46. } catch (IOException e) {
    47. e.printStackTrace();
    48. }
    49. return null;
    50. }
    51. return url;
    52. }
    53. /**
    54. * 判断是不是ajax请求
    55. */
    56. private boolean isAjax(HttpServletRequest request) {
    57. String xHeader = request.getHeader("X-Requested-With");
    58. return (xHeader != null && xHeader.contains("XMLHttpRequest"));
    59. }
    60. /**
    61. * 支持跨域请求
    62. */
    63. private void cross(HttpServletResponse response) {
    64. response.setHeader("Access-Control-Allow-Origin", "*");
    65. response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    66. response.setHeader("Access-Control-Max-Age", "3600");
    67. response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header, Authorization");
    68. }
    69. }

    如果要针对各个服务捕获不同的异常,可以新建ExceptionHandler,区分不同的@ControllerAdvisebasePackages即可。