GlobalExceptionHandler.java 5.1 KB

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