GlobalExceptionHandler.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.webflux.launchadmin.global;
  2. import com.alibaba.fastjson.JSON;
  3. import com.plumelog.core.util.LogExceptionStackTrace;
  4. import com.webflux.launchcommon.returnObj.RW;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.dao.DataAccessException;
  7. import org.springframework.http.HttpStatus;
  8. import org.springframework.util.MultiValueMap;
  9. import org.springframework.validation.BindException;
  10. import org.springframework.web.bind.MethodArgumentNotValidException;
  11. import org.springframework.web.bind.annotation.ExceptionHandler;
  12. import org.springframework.web.bind.annotation.ResponseBody;
  13. import org.springframework.web.bind.annotation.ResponseStatus;
  14. import org.springframework.web.bind.annotation.RestControllerAdvice;
  15. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  16. import org.springframework.web.reactive.resource.NoResourceFoundException;
  17. import org.springframework.web.server.MethodNotAllowedException;
  18. import org.springframework.web.server.MissingRequestValueException;
  19. import org.springframework.web.server.ServerWebExchange;
  20. import reactor.core.publisher.Mono;
  21. import javax.security.auth.login.AccountExpiredException;
  22. import java.nio.file.AccessDeniedException;
  23. import java.util.HashMap;
  24. import java.util.Map;
  25. import java.util.Objects;
  26. /**
  27. * @author moka
  28. */
  29. @RestControllerAdvice
  30. @Slf4j
  31. public class GlobalExceptionHandler {
  32. @ExceptionHandler(BaseException.class)
  33. public Mono<RW<Object>> handleException(ServerWebExchange exchange, BaseException e) {
  34. log.warn("接口异常 uri={} e={}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  35. return RW.fail("500", e.getMessage(), Mono.just(e.getMessage()));
  36. }
  37. /**
  38. * 文件上传异常
  39. */
  40. @ExceptionHandler(MaxUploadSizeExceededException.class)
  41. public Mono<RW<Object>> baseException(MaxUploadSizeExceededException e) {
  42. return RW.fail("文件大小超出限制,请修改后重新上传。", Mono.just(e.getMessage()));
  43. }
  44. @ExceptionHandler(AccessDeniedException.class)
  45. public Mono<RW<Object>> handleAuthorizationException(ServerWebExchange exchange, AccessDeniedException e) {
  46. log.warn("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  47. return RW.fail(HttpStatus.FORBIDDEN.toString(), "没有权限,请联系管理员授权", Mono.just(e.getMessage()));
  48. }
  49. @ExceptionHandler(IllegalArgumentException.class)
  50. public Mono<RW<Object>> handleIllegalArgumentException(ServerWebExchange exchange, IllegalArgumentException e) {
  51. log.warn("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  52. return RW.fail(HttpStatus.FORBIDDEN.toString(), "请求参数异常", Mono.just(e.getMessage()));
  53. }
  54. //@ResponseStatus(HttpStatus.BAD_REQUEST)
  55. @ExceptionHandler(MissingRequestValueException.class)
  56. public Mono<RW<Object>> handleMissingRequestValueException(ServerWebExchange exchange, MissingRequestValueException e) {
  57. log.warn("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  58. return RW.fail(HttpStatus.FORBIDDEN.toString(), "请求参数异常", Mono.just(e.getMessage()));
  59. }
  60. @ExceptionHandler(AccountExpiredException.class)
  61. public Mono<RW<Object>> handleAccountExpiredException(ServerWebExchange exchange, AccountExpiredException e) {
  62. log.warn("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  63. return RW.fail(e.getMessage(), Mono.just(e.getMessage()));
  64. }
  65. @ExceptionHandler(DataAccessException.class)
  66. public Mono<RW<Object>> handleDataAccessException(ServerWebExchange exchange, DataAccessException e) {
  67. log.error("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  68. return RW.fail(e.getMessage(), Mono.just(e.getMessage()));
  69. }
  70. @ExceptionHandler(Exception.class)
  71. public Mono<RW<Object>> handleException(ServerWebExchange exchange, Exception e) {
  72. if (e instanceof BaseException
  73. || e instanceof NoResourceFoundException
  74. || e instanceof MethodNotAllowedException) {
  75. try {
  76. Map<String, Object> logger = new HashMap<>();
  77. MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
  78. logger.put("param", queryParams);
  79. String paramStr = JSON.toJSONString(logger);
  80. log.info("裂变项目api请求记录:{}:{}", exchange.getRequest().getPath().value(), paramStr);
  81. } catch (Exception e1) {
  82. log.warn("裂变项目api请求记录异常:{}", LogExceptionStackTrace.erroStackTrace(e1));
  83. }
  84. log.warn("接口异常 uri= {} e= {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  85. } else {
  86. log.error("接口异常 uri = {} e = {}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  87. }
  88. return RW.fail(e.getMessage(), Mono.just(e.getMessage()));
  89. }
  90. /**
  91. * 自定义验证异常
  92. */
  93. @ExceptionHandler(BindException.class)
  94. public Mono<RW<Object>> validatedBindException(ServerWebExchange exchange, BindException e) {
  95. log.warn("接口异常 uri={} e={}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  96. String message = e.getAllErrors().getFirst().getDefaultMessage();
  97. assert message != null;
  98. return RW.fail(message, Mono.just(message));
  99. }
  100. /**
  101. * 自定义验证异常
  102. */
  103. @ExceptionHandler(MethodArgumentNotValidException.class)
  104. public Mono<RW<Object>> validExceptionHandler(ServerWebExchange exchange, MethodArgumentNotValidException e) {
  105. log.warn("接口异常 uri={} e={}", exchange.getRequest().getPath().value(), LogExceptionStackTrace.erroStackTrace(e));
  106. String message = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
  107. assert message != null;
  108. return RW.fail(message, Mono.just(message));
  109. }
  110. }