Java--SpringBoot-19-SpringBoot集成Swagger

简介: 在开发接口完后,我们都要编写接口规范文档,今天整一个能自动生成接口规范文档,并且能在开发的时候顺带的就能把文档更新的东西,她就是Swagger!

在开发接口完后,我们都要编写接口规范文档,今天整一个能自动生成接口规范文档,并且能在开发的时候顺带的就能把文档更新的东西,她就是Swagger!

       Swagger是个啥?包括很多东西,比如没开源的Swagger Hub,我使用的是开源的功能,能自动生成Restful风格的接口文档,哦对,还能直接当作端点来调试接口,有了它就卸载掉Postman吧。

       目前使用Swagger最新版本可以直接引入Springfox,以前叫swagger-springmvc,Springfox是一个通过扫描代码提取代码中的信息,生成API文档的工具。

在SpringBoot中集成Swagger,我们直接看最新引入方式:

一、引入依赖项

<!--集成swagger3--><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

我在使用的时候,发现报了个spring-plugin-core版本的错误,我打开包看了下,依赖项版本默认是1.2,我改成了2.0就不报错了:

<!--集成swagger3--><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency><!--集成swagger3默认是1.2要使用2.0--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version></dependency>

SpringBoot的“习惯优于配置”特性,其实现在已经自动配置好了

@EnableOpenApi

直接访问:

http://localhost:port/swagger-ui/index.html

默认的样式不好看哈:

image.png

接口内容都是可以自定义的,直接贴完整代码:


importcom.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
importio.swagger.models.auth.In;
importorg.apache.commons.lang3.reflect.FieldUtils;
importorg.springframework.boot.SpringBootVersion;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Import;
importorg.springframework.util.ReflectionUtils;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistration;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
importspringfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
importspringfox.documentation.builders.ApiInfoBuilder;
importspringfox.documentation.builders.PathSelectors;
importspringfox.documentation.builders.RequestHandlerSelectors;
importspringfox.documentation.oas.annotations.EnableOpenApi;
importspringfox.documentation.service.*;
importspringfox.documentation.spi.DocumentationType;
importspringfox.documentation.spi.service.contexts.SecurityContext;
importspringfox.documentation.spring.web.plugins.Docket;
importjava.lang.reflect.Field;
importjava.util.*;
@EnableOpenApi@Configuration@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)
publicclassSwaggerConfigimplementsWebMvcConfigurer {
@BeanpublicDocketcreateRestApi() {
returnnewDocket(DocumentationType.OAS_30).pathMapping("/")
//定义是否开启swagger,false为关闭,可以通过变量控制                .enable(true)
//将api的元信息设置为包含在jsonResourceListing响应中。                .apiInfo(apiInfo())
//接口调试地址//                .host()
//选择哪些接口作为swagger的doc发布                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
//支持的通讯协议集合                .protocols(newHashSet("https", "http"))
//授权信息设置,必要的headertoken等认证信息                .securitySchemes(securitySchemes())
//授权信息全局应用                .securityContexts(securityContexts());
    }
/***API页面上半部分展示信息*/privateApiInfoapiInfo() {
returnnewApiInfoBuilder().title("queryBasic接口文档"+" Api Doc")
                .description("基本信息接口文档")
                .contact(newContact("rt", null, ""))
                .version("Application Version: 1.0, Spring Boot Version: "+SpringBootVersion.getVersion())
                .build();
    }
/***设置授权信息*/privateList<SecurityScheme>securitySchemes() {
ApiKeyapiKey=newApiKey("BASE_TOKEN", "token", In.HEADER.toValue());
returnCollections.singletonList(apiKey);
    }
/***授权信息全局应用*/privateList<SecurityContext>securityContexts() {
returnCollections.singletonList(
SecurityContext.builder()
                        .securityReferences(
Collections.singletonList(
newSecurityReference(
"BASE_TOKEN", newAuthorizationScope[]{newAuthorizationScope("global", "")})))
                        .build()
        );
    }
@SafeVarargsprivatefinal<T>Set<T>newHashSet(T... ts) {
if (ts.length>0) {
returnnewLinkedHashSet<>(Arrays.asList(ts));
        }
returnnull;
    }
/***通用拦截器排除swagger设置,所有拦截器都会自动加swagger相关的资源排除信息*@paramregistryregistry*/@SuppressWarnings("unchecked")
@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry) {
try {
FieldregistrationsField=FieldUtils.getField(InterceptorRegistry.class, "registrations", true);
List<InterceptorRegistration>registrations= (List<InterceptorRegistration>) ReflectionUtils.getField(registrationsField, registry);
if (registrations!=null) {
for (InterceptorRegistrationinterceptorRegistration : registrations) {
interceptorRegistration                            .excludePathPatterns("/swagger**/**")
                            .excludePathPatterns("/webjars/**")
                            .excludePathPatterns("/v3/**")
                            .excludePathPatterns("/doc.html");
                }
            }
        } catch (Exceptione) {
e.printStackTrace();
        }
    }
}

上面implements WebMvcConfigurer 是为了解决 swagger静态资源无法访问的问题,试了下发现不解决也能直接访问,想去就去掉。

然后来美化下页面!

二、使用swagger-bootstrap-ui美化

<!--https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency>

其实就是引入了一个封装好的bootstrap-ui哈,可以让页面更好看,访问改成:

http://localhost:port/doc.html

不贴图了,自己试试哇

三、感觉这个样式最屌-knife4j-spring-boot-starter

<!--整合UI美化swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency>

这个添加以下配置:

@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)


image.png

优秀 ,奥里给!可以像使用Postman一样来调试接口:

image.png


四、使用

一些常用注解说明

@Api:用在controller类,描述API接口

@ApiOperation:描述接口方法

@ApiModel:描述对象

@ApiModelProperty:描述对象属性

@ApiImplicitParams:描述接口参数

@ApiResponses:描述接口响应

@ApiIgnore:忽略接口方法


Controller使用:

@GetMapping("/hi")
@ApiIgnore//@ApiIgnore忽略该接口方法publicStringsayHi(){
return"hi";
}
@GetMapping("/hello/{id}")
@ApiOperation(value="测试接口",produces=MediaType.TEXT_PLAIN_VALUE,httpMethod="GET",notes="打印字符串到页面,用来测试服务是否部署成功")
@ApiImplicitParam(name="id", value="用户ID", required=true, dataType="Long")
publicStringsayHello(@PathVariableStringid){
logger.info("HELLO WOLD -> id:"+id);
return"Hello Wold"+id;
}
@PostMapping(value="/getBasicList",produces= {MediaType.APPLICATION_JSON_UTF8_VALUE})
@ApiOperation(
value="基本信息列表查询接口",
consumes=MediaType.APPLICATION_JSON_UTF8_VALUE,
produces="application/json;charset=UTF-8",
httpMethod="POST",
notes="根据传入对象中的值获取对应列表信息",
response=ResponseCommonVO.class    )
publicResponseCommonVO<Object>getQueryBasicList(HttpServletRequestrequest, HttpServletResponseresponse,
@RequestBodyRequestCommonVo<BasicInfo>data){
    }

实体类使用:

/***公共请求类*/@Data@ApiModel(value="RequestCommonVo",description="公共的请求实体类")
publicclassRequestCommonVo<T> {
@ApiModelProperty(value="请求头",required=true)
privateHeadCommonhead;
@ApiModelProperty(value="请求体",required=true,notes="请求内容对象")
privateTObj;
}

这个注解最蛋疼,有时候不起作用,要多研究下:

@ApiImplicitParam(required=true,name="data",value="请求对象",dataTypeClass=RequestCommonVo.class)
required=true指定参数是否是必需的。name="data"参数的名称。为了实现正确的斯瓦格功能,请在根据paramType()命名参数时遵循以下规则:
如果paramType是“路径”,则该名称应该是路径中的关联部分。对于所有其他情况,该名称应该是您的应用程序期望接受的参数名称。value="请求对象"参数的简短描述。dataType=""参数的数据类型。这可以是类名或原语。dataTypeClass=参数的类。覆盖dataType(如果提供)
defaultValue=描述参数的默认值。allowableValues=限制此参数的可接受值。有三种方法来描述允许值:
要设置值列表,请提供逗号分隔的列表。比如:第一,第二,第三。要设置值的范围,请以“范围”开始值,并用方括号括起来,包括最小值和最大值,或者用圆括号括起来,表示唯一的最小值和最大值。例如:范围[1,5],范围(1,5),范围[1,5]要设置最小值/最大值,请使用相同的范围格式,但使用“无穷大”或“-infinity”作为第二个值。例如,范围[1,无穷大]表示该参数的最小允许值为1。access=""允许从应用编程接口文档中过滤参数allowMultiple=false指定参数是否可以通过多次出现来接受多个值。paramType=""参数的参数类型。有效值为路径、查询、正文、标题或表单。example=""非实体类型参数的单个示例type=""添加覆盖检测到的类型的能力format=""增加了提供自定义格式的能力allowEmptyValue() defaultfalse增加了将格式设置为空的能力readOnly() defaultfalse; 增加了被指定为只读的能力。collectionFormat() =""; 增加了用“数组”类型覆盖集合格式的能力

tags 可以设置将多个接口设置成一组接口

比如 @ApiOperation(value = "基本信息保存接口",tags = {"基本信息保存"},httpMethod = "POST")

tags = {"基本信息保存"}

tags = "基本信息保存"


总结:

       我感觉写代码的时候要加那么多的注解有点不习惯,不是想象中的那么屌!@ApiParam(value = “ID”) 注解中的value参数只有和:@PathVariable(value = “id”) 以及@RequestParam使用,value参数才会有效果。



END

目录
相关文章
|
1月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
10天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
22 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
9天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
24 1
|
18天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
58 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
19天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。 查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。 从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。
46 0
|
1月前
|
开发工具 Python
django之drf集成swagger
django之drf集成swagger
|
1月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
1月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
10天前
|
XML Java 数据库
Java与XQuery在BaseX集成中的实践指南
Java与XQuery在BaseX集成中的实践指南
7 0
|
2月前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。