1. 定义swagger数据源
首先,我们需要从spring cloud gateway中配置的路由信息中获取路径
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Primary
public class SwaggerResources implements SwaggerResourcesProvider {
@Autowired
private RouteLocator routeLocator;
@Value("${spring.application.name}")
private String gatewayServiceName;
@Override
public List<SwaggerResource> get() {
List<Route> routeList=new ArrayList<>();
routeLocator.getRoutes()
//排除springcloudgateway本身
.filter(route -> !route.getUri().getHost().equals(gatewayServiceName))
.subscribe(route->routeList.add(route));
return routeList.stream().distinct().map(route -> {
//这里我们是在路由配置中的metaData中添加了服务名称,我们把他作为swagger的groupName,也就是swagger页面右上角下拉框
String groupName=(String) route.getMetadata().get("name");
String url = "/"+route.getId()+"/v3/api-docs?group="+groupName;
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setUrl(url);
swaggerResource.setName(groupName);
swaggerResource.setSwaggerVersion("3.0.3");
return swaggerResource;
}).collect(Collectors.toList());
}
}

这里,swagger是通过inferred url来确定访问接口的跟路径,这个inffered url是通过/swagger-resources这个接口来确定的,返回结果如图:
但是,我们现在的IP和端口号是网关的,它返回的路径服务本身的根路径,只能通过服务自己去访问,网关无法访问。所以这里我们需要对返回的内容做处理,也就是加上路由到服务的路径,这样我们就可以通过网关路由到每个服务的/v3/api-docs这个接口。
2. 为swagger创建一个Filter
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author pf
* @date 2021/6/3 16:17
*/
@Component
public class SwaggerBaseInferredUrlFilter implements GlobalFilter, Ordered {
private ObjectMapper objectMapper=new ObjectMapper();
@Override
public int getOrder() {
// -1 is response write filter, must be called before that
return -2;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//仅限swagger过滤:/v3/api-docs
if(exchange.getRequest().getPath().toString().indexOf("/v3/api-docs")==-1){
return chain.filter(exchange);
}
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (body instanceof Flux&&originalResponse.getStatusCode().equals(HttpStatus.OK)) {
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
return super.writeWith(fluxBody.buffer().map(dataBuffer -> {
DataBuffer join = bufferFactory.join(dataBuffer);
byte[] content = new byte[join.readableByteCount()];
join.read(content);
DataBufferUtils.release(join);
String responseData = new String(content, Charset.forName("UTF-8"));
//截断问题处理
responseData = responseData.replaceAll(":null", ":\"\"");
try {
Map map=objectMapper.readValue(responseData, Map.class);
List<LinkedHashMap<String,String>> servers= (List<LinkedHashMap<String,String>>) map.get("servers");
servers.forEach(server->{
String inferredUrl=server.get("url");
//这里需要注意,我的服务路由用的是一截路径,所以就这样处理了
inferredUrl+="/"+exchange.getRequest().getPath().toString().split("/")[1];
server.put("url",inferredUrl);
});
map.put("servers",servers);
responseData=objectMapper.writeValueAsString(map);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
byte[] uppedContent = responseData.getBytes();
return bufferFactory.wrap(uppedContent);
}));
}
// if body is not a flux. never got there.
return super.writeWith(body);
}
};
// replace response with decorator
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
效果应该是这样:
最后一次更新于2021-08-23


2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
By qacfjljguc at October 7th, 2025 at 07:26 pm.
新车上路,只带前10个人coinsrore.com
By whxvvcwrzm at October 6th, 2025 at 07:00 pm.
社会责任感贯穿全文,彰显学者担当。
By zfyuyznbiu at March 2nd, 2025 at 10:51 pm.
文章深入浅出,既有深度思考,又不乏广度覆盖,令人叹为观止。
By ayrvypetil at March 2nd, 2025 at 09:18 pm.
文章深入浅出,既有深度思考,又不乏广度覆盖,令人叹为观止。
By rvgmqtkuca at March 1st, 2025 at 02:31 am.
《钴蓝爱恋》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/60319.html
By pzvdmipojs at December 15th, 2024 at 03:51 pm.
《钴蓝爱恋》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/60319.html
By qzzzyuzmmr at December 8th, 2024 at 05:48 am.
你的文章内容非常卖力,让人点赞。 http://www.55baobei.com/vlMgdAj1HS.html
By tlyejvrxdj at November 30th, 2024 at 04:50 am.
《密室大逃脱第五季大神版》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/33144.html
By mdxjbaqisl at November 22nd, 2024 at 10:28 am.
你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/2iOenet24R.html
By cdkzlbehmt at November 21st, 2024 at 05:14 pm.
你的才华让人瞩目,期待你的更多文章。 https://www.4006400989.com/qyvideo/87747.html
By lgzlxnzkxw at November 14th, 2024 at 10:15 pm.