GlobalExceptionHandler.java 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package com.kxs.gateway.api.handler;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.kxs.common.core.util.R;
  5. import lombok.RequiredArgsConstructor;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
  8. import org.springframework.core.annotation.Order;
  9. import org.springframework.core.io.buffer.DataBufferFactory;
  10. import org.springframework.http.MediaType;
  11. import org.springframework.http.server.reactive.ServerHttpResponse;
  12. import org.springframework.web.server.ResponseStatusException;
  13. import org.springframework.web.server.ServerWebExchange;
  14. import org.springframework.web.server.handler.ResponseStatusExceptionHandler;
  15. import reactor.core.publisher.Mono;
  16. /**
  17. * 网关异常通用处理器,只作用在webflux 环境下 , 优先级低于 {@link ResponseStatusExceptionHandler} 执行
  18. *
  19. * @author 没秃顶的码农
  20. * @date 2023/11/19
  21. */
  22. @Slf4j
  23. @Order(-1)
  24. @RequiredArgsConstructor
  25. public class GlobalExceptionHandler implements ErrorWebExceptionHandler {
  26. private final ObjectMapper objectMapper;
  27. @Override
  28. public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
  29. ServerHttpResponse response = exchange.getResponse();
  30. if (response.isCommitted()) {
  31. return Mono.error(ex);
  32. }
  33. // header set
  34. response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
  35. if (ex instanceof ResponseStatusException) {
  36. response.setStatusCode(((ResponseStatusException) ex).getStatusCode());
  37. }
  38. return response.writeWith(Mono.fromSupplier(() -> {
  39. DataBufferFactory bufferFactory = response.bufferFactory();
  40. try {
  41. log.error("Error Spring Gateway : {} {}", exchange.getRequest().getPath(), ex.getMessage());
  42. return bufferFactory.wrap(objectMapper.writeValueAsBytes(R.failed(ex.getMessage())));
  43. }
  44. catch (JsonProcessingException e) {
  45. log.error("Error writing response", ex);
  46. return bufferFactory.wrap(new byte[0]);
  47. }
  48. }));
  49. }
  50. }