GlobalExceptionHandler.java 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 2020/5/26
  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.warn("Error Spring Cloud 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. }