| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package com.inspur.smsb.gateway.handler;
- import com.alibaba.cola.dto.Response;
- import com.alibaba.fastjson.JSON;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
- import org.springframework.cloud.gateway.support.NotFoundException;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.core.annotation.Order;
- import org.springframework.core.io.buffer.DataBufferFactory;
- import org.springframework.http.HttpStatus;
- import org.springframework.http.MediaType;
- import org.springframework.http.server.reactive.ServerHttpResponse;
- import org.springframework.lang.NonNull;
- import org.springframework.web.server.ResponseStatusException;
- import org.springframework.web.server.ServerWebExchange;
- import reactor.core.publisher.Mono;
- /**
- * 网关统一异常处理
- *
- * @author liangke
- */
- @Slf4j
- @Configuration
- @Order(-1)
- @RequiredArgsConstructor
- public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
- /**
- * @param exchange exchange
- * @param ex ex
- * @return Mono<Void>
- */
- @NonNull
- @Override
- public Mono<Void> handle(ServerWebExchange exchange, @NonNull Throwable ex) {
- ServerHttpResponse response = exchange.getResponse();
- if (exchange.getResponse().isCommitted()) {
- return Mono.error(ex);
- }
- String msg;
- if (ex instanceof NotFoundException) {
- msg = "服务未找到";
- } else if (ex instanceof ResponseStatusException) {
- ResponseStatusException responseStatusException = (ResponseStatusException) ex;
- msg = responseStatusException.getMessage();
- } else {
- msg = "内部服务器错误";
- }
- log.error("[网关异常处理]请求方法:{},请求路径: {},异常信息: {}", exchange.getRequest().getMethod(), exchange.getRequest().getPath(), ex.getMessage());
- response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
- response.setStatusCode(HttpStatus.OK);
- return response.writeWith(Mono.fromSupplier(() -> {
- DataBufferFactory bufferFactory = response.bufferFactory();
- return bufferFactory.wrap(JSON.toJSONBytes(Response.buildFailure("500", msg)));
- }));
- }
- }
|