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 */ @NonNull @Override public Mono 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))); })); } }