GlobalExceptionHandler.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package com.cyksj.web;
  2. import com.cyksj.common.util.StringUtil;
  3. import com.cyksj.dto.Result;
  4. import com.cyksj.enums.GatewayApiCode;
  5. import com.cyksj.enums.GatewayResponse;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.validation.BindException;
  9. import org.springframework.validation.FieldError;
  10. import org.springframework.web.bind.annotation.ExceptionHandler;
  11. import org.springframework.web.bind.annotation.RestControllerAdvice;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.validation.ConstraintViolation;
  14. import javax.validation.ConstraintViolationException;
  15. import java.util.List;
  16. import java.util.Set;
  17. import java.util.TreeSet;
  18. /**
  19. * @description 异常全局拦截
  20. * @author chan
  21. * @date 2021-03-22 9:51 下午
  22. */
  23. @Slf4j
  24. @RestControllerAdvice
  25. public class GlobalExceptionHandler {
  26. @Autowired
  27. protected HttpServletRequest request;
  28. @ExceptionHandler(value = {Exception.class})
  29. public Result<String> handleNoteException(Exception e) {
  30. StringBuilder builder = new StringBuilder(32);
  31. builder.append(request.getRequestURI()).append(" -- > ");
  32. StackTraceElement[] trace = e.getStackTrace();
  33. log.info("{}",e);
  34. for (StackTraceElement element : trace) {
  35. if (StringUtil.startsWith(element.getClassName(), "com.cyksj")) {
  36. builder.append(element.getFileName())
  37. .append("[").append(element.getLineNumber()).append("]")
  38. .append("&");
  39. }
  40. }
  41. builder.deleteCharAt(builder.length() - 1);
  42. String message = e.getMessage();
  43. String value = builder.toString();
  44. log.error("全局错误处理: \n Cause: {} \n Value: {}", message, value);
  45. return GatewayResponse.FAIL.newBuilder().setMsg(message).toResult(value);
  46. }
  47. @ExceptionHandler(value = ConstraintViolationException.class)
  48. public Result<String> ConstraintViolationException(ConstraintViolationException ex) {
  49. String message = "";
  50. // 使用TreeSet是为了让输出的内容有序输出(默认验证的顺序是随机的)
  51. Set<String> errorInfoSet = new TreeSet<String>();
  52. Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
  53. if (!violations.isEmpty()) {
  54. for (ConstraintViolation<?> item : violations) {
  55. System.out.println(item.getPropertyPath());
  56. // 遍历错误字段信息
  57. errorInfoSet.add(item.getMessage());
  58. }
  59. StringBuilder sbf = new StringBuilder();
  60. for (String errorInfo : errorInfoSet) {
  61. sbf.append(errorInfo);
  62. sbf.append(",");
  63. }
  64. message = sbf.substring(0, sbf.length() - 1);
  65. }
  66. log.error("错误字段 信息: \n Value: {}", message);
  67. return GatewayResponse.FAIL.newBuilder().buildGatewayCode(GatewayApiCode.PARAMETER_MISSING_ERROR).setMsg(message).toResult();
  68. }
  69. @ExceptionHandler(BindException.class)
  70. public Result<String> BindException(BindException bindingResult) {
  71. // 验证参数信息是否有效
  72. if (bindingResult.hasErrors()) {
  73. // 获取错误字段信息集合
  74. List<FieldError> fieldErrorList = bindingResult.getFieldErrors();
  75. // 使用TreeSet是为了让输出的内容有序输出(默认验证的顺序是随机的)
  76. Set<String> errorInfoSet = new TreeSet<String>();
  77. for (FieldError fieldError : fieldErrorList) {
  78. // 遍历错误字段信息
  79. errorInfoSet.add(fieldError.getDefaultMessage());
  80. }
  81. StringBuilder sbf = new StringBuilder();
  82. for (String errorInfo : errorInfoSet) {
  83. sbf.append(errorInfo);
  84. sbf.append(",");
  85. }
  86. String message = sbf.substring(0, sbf.length() - 1);
  87. log.error("验证参数信息是否有效 错误信息: \n Value: {}", message);
  88. return GatewayResponse.FAIL.newBuilder().buildGatewayCode(GatewayApiCode.PARAMETER_MISSING_ERROR).setMsg(message).toResult();
  89. }
  90. return GatewayResponse.SUCCESS.newBuilder().buildGatewayCode(GatewayApiCode.SUCCESS).setMsg("参数校验通过").toResult();
  91. }
  92. }