zuul网关集成swagger

zuul网关集成swaggerswagger2是一个API文档生成工具,在微服务的架构中,一般会使用zuul作为api网关,适合用来集成swagger生成所有微服务的接口文档。(springboot版本1.5.9)zuul服务添加依赖springfox-swagger2是用于生成接口文档的,必须要依赖springfox-swagger-ui负责提供ui查询界面,这里因为是在zuul集成,所以只需要z…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

     swagger2是一个API文档生成工具,在微服务的架构中,一般会使用zuul作为api网关,适合用来集成swagger生成所有微服务的接口文档。(springboot版本1.5.9)

 

zuul服务添加依赖

springfox-swagger2是用于生成接口文档的,必须要依赖

springfox-swagger-ui负责提供ui查询界面,这里因为是在zuul集成,所以只需要zuul依赖就可以了,其他的应用只负责提供接口文档的数据,不需要ui界面查询,所以无需依赖

       <!--生成接口文档-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--提供ui界面-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

zuul添加swagger配置

import org.springframework.cloud.netflix.zuul.filters.Route;
import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;

//通过configuration注解自动注入配置文件
@Configuration
//开启swagger功能
@EnableSwagger2
//如果有多个配置文件,以这个为准
@Primary
//实现SwaggerResourcesProvider,配置swagger接口文档的数据源
public class SwaggerConfig  implements SwaggerResourcesProvider {

    //RouteLocator可以根据zuul配置的路由列表获取服务
    private final RouteLocator routeLocator;

    public SwaggerConfig(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }

    //这个方法用来添加swagger的数据源
    @Override
    public List<SwaggerResource> get() {
        List resources = new ArrayList();
        List<Route> routes = routeLocator.getRoutes();
        //通过RouteLocator获取路由配置,遍历获取所配置服务的接口文档,这样不需要手动添加,实现动态获取
        for (Route route: routes) {
            resources.add(swaggerResource(route.getId(), route.getFullPath().replace("**", "v2/api-docs"),"2.0"));
        }
        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location, String version) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion(version);
        return swaggerResource;
    }

}

一般来说zuul服务不会额外提供接口,所以zuul服务本身不需要创建swagger文档,到这里就完成了与swagger的集成,下面是其他服务的集成

 

================================================================================================

添加依赖

是需要依赖springfox-swagger2即可

       <!--生成接口文档-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>

添加配置文件

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    //创建接口文档
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //扫描com.au.sa包下文件
                .apis(RequestHandlerSelectors.basePackage("com.au.sa"))
                //扫描@Api注解的类
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                //扫描@ApiOperation注解的方法
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();
    }

    //接口文档的描述
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("XXX模块")
                .description("XXX模块")
                .version("1.0")
                .build();
    }


}

创建接口类

接口类注意要在上面扫描的com.au.sa包下面,类要注入@Api,需要生成接口文档的接口需要加上@ApiOperation注解

@Api(tags = "customer服务接口")
@RestController
@RequestMapping("/customerService")
public class CustomerService extends MyCommonService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomerService.class);
    @Autowired
    private ICustomer customerServer;

    @Override
    public IMybatisBaseCommon<?> getBaseCommonServer() {
        return this.customerServer;
    }


    @ApiOperation("查询列表(不分页)")
    @ApiImplicitParam(name = "params", value = "查询参数",dataType = "String")
    @GetMapping("/findCustomerList")
    public String findCustomerList(@RequestParam(required = false) String params){
        return this.findList(params);
    }

    @ApiOperation("分页查询")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "params",value = "查询参数",dataType = "String", required = true),
            @ApiImplicitParam(name = "pageIndex",value = "当前页码", dataType = "int"),
            @ApiImplicitParam(name = "pageRows",value = "分页大小", dataType = "int")})
    @GetMapping("/findCustomerPagination")
    public String findCustomerPagination(@RequestParam(required = false) String params,
                                         @RequestParam(required = false,defaultValue = "1") Integer pageIndex,
                                         @RequestParam(required = false,defaultValue = "10") Integer pageRows){
        return super.findPagination(params,pageIndex,pageRows);
    }


    @ApiOperation("根据主键ID获取对象")
    @ApiImplicitParam(name = "params", value = "json字符串格式,必须包含参数id",dataType = "String", required = true)
    @PostMapping("/findById")
    public String findById(@RequestParam String params) {
        return super.findById(params);
    }


    @ApiOperation("保存")
    @ApiImplicitParam(name = "params",value = "需要保存的对象,json字符串格式", dataType = "String", required = true)
    @PostMapping("/save")
    public String saveOrUpdate(@RequestParam String params) {
        return super.saveOrUpdate(params);
    }

    @ApiOperation("删除")
    @ApiImplicitParam(name = "params", value = "json字符串格式,必须包含参数id,多个id用逗号隔开", dataType = "String", required = true)
    @PostMapping("/delete")
    public String delete(@RequestParam String params) {
        return super.delete(params);
    }
}

 

验证

zuul服务起来之后就可以访问到swagger了,这里zuul因为是加了api前缀,所以访问的时候要加上/api,一般来说直接主机ip+端口号+/swagger-ui.html就可以访问了,下拉列表就是根据zuul的路由配置所拿到的服务。(这里还没有起其他服务,所以是500)

zuul网关集成swagger

接下来把其他服务启动一下,然后在界面选择对应的服务,起来之后就可以看到扫描出来的接口

zuul网关集成swagger

点击具体接口可以看到接口的详细说明,这些说明都是根据接口类中方法的注解生成的,具体注解属性对应的说明自行百度一下swagger的注解说明

zuul网关集成swagger

 

这里记录一下遇到的几个坑:

1.swagger2的获取文档的接口以及页面等静态资源都是依赖包中提供的,如果项目中对请求有拦截的话需要将swagger的相关接口添加到例外,否则将无法访问,springboot的可以使用corsconfig的方式添加排除,主要将下面几个前缀的添加到例外

whiteList.add("swagger-resources");
whiteList.add("configuration");
whiteList.add("v2/");
whiteList.add("swagger-ui.html");
whiteList.add("webjars");

2.其他服务类在配置swagger的时候,createRestApi()生成接口文档扫描时不要贪图方便直接扫描@Api或者@ApiOperation,还是按照上面的扫描对应的包下面的,否则会将swagger自身的接口也会一起扫描出来或者是扫描不到方法

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170629.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Thread.IsBackground

    Thread.IsBackground解释:  获取或设置一个值,该值指示某个线程是否为后台线程。  后台线程不会防止应用程序的进程被终止掉。        注意:主线程中创建了一个线程,线程的IsBackground默认是设置为FALSE的。主线程退出时,IsBackground=FALSE线程继续执行下去,直到线程执行结束。IsBackground=TRUE的线程才会随着主线程的退出…

    2022年10月17日
  • R语言作图——density plot(密度图)

    R语言作图——density plot(密度图)原创黄小仙上次分享了小提琴曲线(violinplot)的作图方法,今天小仙同学给大家介绍一下如何用R画出漂亮的密度图(densityplot)。Step1.绘图数据的准备首先还是要把你想要绘图的数据调整成R语言可以识别的格式excel中保存成csv格式。数据的格式如下图:一列表示一种变量,第一行是列名Step2.绘图数据的读取data&amp;lt;-read.csv(“your…

    2022年10月16日
  • 提交表单的4种方式_java自定义表单

    提交表单的4种方式_java自定义表单通用提交按钮–>2、提交3、说明:用户提交按钮或图像按钮时,就会提交表单。使用或都可以定义提交按钮,只要将其特性的值设置为“submit”即可,而图像按钮则是通过的type特性值设置为”image”来定义的。因此,只要我们单击一下代码生成的按钮,就可以提交表单。4、阻止表单提交只要在表单中存在上面列出的任何一种按钮,那么相应表单控件拥有焦点的情况下,按回车键就可以提交表单。如果表单里没有提…

  • android之存储篇_存储方式总览

    作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File。由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。  SQLite: SQLit

  • VMware虚拟机上网问题

    VMware虚拟机上网问题最近我遇到很多朋友在问我vmwareworkstation版本虚拟机的上网问题,在这里,我就针对这个问题做一些说明。为了朋友们更好的理解VMwareWorkstation版本虚拟机是如何连接网络的,下面我就对VMware的3种网络模型做一下相关的介绍。1.首先,介绍一下VMware的几个虚拟的网络设备:VMnet0:在桥接模式下的虚拟交换机VMnet1:在Hos

  • Java多线程——基本概念「建议收藏」

    Java多线程——基本概念「建议收藏」线程和多线程程序:是一段静态的代码,是应用软件执行的蓝本进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程线程:是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念主线程:(每个Java程序都有一个…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号