ExceptionControllerAdvice.java 4.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.mokasz.sample.common.aspect;
  2. import cn.hutool.core.exceptions.ExceptionUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.mokasz.sample.common.context.ApiContext;
  6. import com.mokasz.sample.common.decorator.Slf4jDecorator;
  7. import com.mokasz.sample.common.exception.ApiArgumentBizException;
  8. import com.mokasz.sample.common.exception.ApiBizException;
  9. import com.mokasz.sample.common.exception.AuditBizException;
  10. import com.mokasz.sample.common.exception.CommonBizException;
  11. import com.mokasz.sample.common.model.ApiResponse;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.validation.BindingResult;
  14. import org.springframework.validation.FieldError;
  15. import org.springframework.validation.ObjectError;
  16. import org.springframework.web.bind.MethodArgumentNotValidException;
  17. import org.springframework.web.bind.annotation.ExceptionHandler;
  18. import org.springframework.web.bind.annotation.RestControllerAdvice;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.servlet.http.HttpServletResponse;
  21. import javax.validation.ConstraintViolationException;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. @RestControllerAdvice(basePackages = {"com.mokasz.sample.api.controller", "com.mokasz.sample.admin.controller"})
  26. @Slf4j
  27. public class ExceptionControllerAdvice {
  28. @ExceptionHandler
  29. public ApiResponse<?> handleException(Exception ex) {
  30. log.error("[ExceptionControllerAdvice]请求处理Exception异常,ex:{},traceId:{}", ExceptionUtil.stacktraceToString(ex), ApiContext.getTraceId());
  31. return ApiResponse.fail("系统异常");
  32. }
  33. @ExceptionHandler({AuditBizException.class})
  34. public ApiResponse<?> handleAuditBizException(AuditBizException ex) {
  35. log.error("[ExceptionControllerAdvice]请求处理AuditBizException异常,msg:{},code:{},ex:{}", ex.getMsg(), ex.getCode(), ExceptionUtil.stacktraceToString(ex));
  36. return ApiResponse.fail(ex.getMsg());
  37. }
  38. @ExceptionHandler({CommonBizException.class})
  39. public ApiResponse<?> handleCommonBizException(CommonBizException ex) {
  40. log.error("[ExceptionControllerAdvice]请求处理CommonBizException异常,msg:{},code:{},ex:{}", ex.getMsg(), ex.getCode(), ExceptionUtil.stacktraceToString(ex));
  41. return ApiResponse.fail(ex.getMsg());
  42. }
  43. @ExceptionHandler({ApiBizException.class})
  44. public ApiResponse<?> handleApiBizException(ApiBizException ex) {
  45. Slf4jDecorator logger = Slf4jDecorator.instance(log);
  46. logger.log(ex.getLevel(), "[ExceptionControllerAdvice]请求处理ApiBizException异常,msg:{},code:{},ex:{}", ex.getMsg(), ex.getCode(), ExceptionUtil.stacktraceToString(ex));
  47. return ApiResponse.fail(ex.getMsg());
  48. }
  49. @ExceptionHandler({ApiArgumentBizException.class})
  50. public ApiResponse<?> handleApiArgumentBizExistException(ApiArgumentBizException ex) {
  51. log.error("[ExceptionControllerAdvice]请求处理ApiArgumentBizException异常,msg:{},code:{},ex:{}", ex.getMsg(), ex.getCode(), ExceptionUtil.stacktraceToString(ex));
  52. return ApiResponse.fail(String.format("ApiArgumentBizException:%s", ex.getMsg()));
  53. }
  54. @ExceptionHandler({MethodArgumentNotValidException.class})
  55. public ApiResponse<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
  56. BindingResult bindResult = ex.getBindingResult();
  57. List<ObjectError> errors = bindResult.getAllErrors();
  58. Map<String, Object> msgMap = new HashMap<>();
  59. errors.forEach(error -> {
  60. if (error instanceof FieldError) {
  61. FieldError fieldError = (FieldError) error;
  62. msgMap.put(StrUtil.toUnderlineCase(fieldError.getField()), fieldError.getDefaultMessage());
  63. } else {
  64. msgMap.put(StrUtil.toUnderlineCase(error.getObjectName()), error.getDefaultMessage());
  65. }
  66. });
  67. log.error("[ExceptionControllerAdvice]请求处理MethodArgumentNotValidException异常,msg:{},ex:{}", JSON.toJSONString(msgMap), ExceptionUtil.stacktraceToString(ex));
  68. return ApiResponse.fail(String.format("MethodArgumentNotValidException:%s", JSON.toJSONString(msgMap)));
  69. }
  70. @ExceptionHandler(ConstraintViolationException.class)
  71. public ApiResponse<?> handleConstraintViolationException(ConstraintViolationException ex, HttpServletRequest request, HttpServletResponse response) {
  72. Map<String, Object> msgMap = new HashMap<>();
  73. ex.getConstraintViolations().forEach(error -> {
  74. String message = error.getMessage();
  75. String path = error.getPropertyPath().toString();
  76. msgMap.put(StrUtil.toUnderlineCase(path), message);
  77. });
  78. log.error("[ExceptionControllerAdvice]请求处理ConstraintViolationException异常,msg:{},ex:{}", JSON.toJSONString(msgMap), ExceptionUtil.stacktraceToString(ex));
  79. return ApiResponse.fail(String.format("ConstraintViolationException:%s", JSON.toJSONString(msgMap)));
  80. }
  81. }