GlobalExceptionHandler.java 5.5 KB

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