Swagger3.0快速开发及空指针异常的解决
目录
前言
一、配置类配置Swagger
二、属性文件配置Swagger
三、配置多个分组
四、配置扫描接口
五、空指针异常
前言
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。简单来说,swagger是一款可以根据RESTful 风格生成的接口开发文档,并且支持做测试的一款中间软件。在前后端分离的时代,特别是在Swagger诞生之后,程序员门可以直接通过代码生成文档,而不再需要自己手动编写API接口文档了。Swagger在一定程度上也能缓解前端、后端、测试开发人员之间不可调和的矛盾,是一款劝架神器。在正式发布的时候要关闭swagger,以便节省内存,保证安全。
一、配置类配置Swagger
1、导入相关依赖:springfox-boot-starter
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>
2、编写Swagger配置类
(1) 可以自定义编写Swagger的配置信息,覆盖默认的apiInfo,通过localhost:8080/swagger-ui/index.html去访问Swagger后台
//配置swagger信息:通过覆盖默认的apiInfoprivate ApiInfo apiInfo() {//配置作者的信息Contact contact = new Contact("全村第二帅", "https://blog.csdn.net/qq_53860947?type=blog", "279618364@qq.com");return new ApiInfo("自定义api文档","码道万古如长夜","v3.0","https://blog.csdn.net/qq_53860947?type=blog",contact,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList());}
(2)配置swagger Docket的bean实例及完整代码
注:要在启动类上加上@EnableWebMvc,否者会报空指针异常
package com.study.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;import java.util.ArrayList;@Configuration
@EnableOpenApi
public class SwaggerConfig {@Bean //配置了swagger的Docket的bean实例public Docket docket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())//.enable(false).select()//RequestHandlerSelectors,配置要扫描接口的方式/* basePackage指定扫描的包;any();扫描全部;none();都不扫描;withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象withMethodAnnotation:扫描方法上的注解.paths()过滤什么路径.enable()是否启用Swagger,默认是true,若为false,则Swagger不能访问,并且会有一个小表情出现*/.apis(RequestHandlerSelectors.basePackage("com.study.controller")).paths(PathSelectors.ant("/study/**")).build();}//配置swagger信息:通过覆盖默认的apiInfoprivate ApiInfo apiInfo() {//配置作者的信息Contact contact = new Contact("全村第二帅", "https://blog.csdn.net/qq_53860947?type=blog", "7758258@qq.com");return new ApiInfo("自定义api文档","码道万古如长夜","v3.0","https://blog.csdn.net/qq_53860947?type=blog",contact,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList());}}
二、属性文件配置Swagger
1、用属性配置文件配置Swagger的信息
application.properties:
#配置Swagger的信息
swagger:title: 自定义api文档basePackage: com.study.swagger2.controllerdescription: 码道万古如长夜version: V3.0name: 全村第二帅url: https://blog.csdn.net/qq_53860947?type=blogemail: 7758258@qq.com
2、配置类
SwaggerConfig.java :
package com.study.swagger2.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;@Configuration
@EnableOpenApi
@EnableWebMvc
public class SwaggerConfig {@Value("${swagger.basePackage}")private String basePackage; // basePackage指定扫描的包@Value("${swagger.title}")private String title; // 自定义当前文档的标题@Value("${swagger.description}")private String description; // 自定义当前文档的详细描述@Value("${swagger.version}")private String version; // 自定义当前文档的版本//自定义作者的信息,包括作者名字、个人主页、邮箱等相关信息@Value("${swagger.name}")private String name;@Value("${swagger.url}")private String url;@Value("${swagger.email}")private String email;@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage(basePackage)).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {Contact contact = new Contact(name,url,email);return new ApiInfoBuilder().title(title).description(description).version(version).contact(contact).build();}
}
3、结果
三、配置多个分组
1、配置API文档默认组
.groupName("全村第二帅")
2、如何配置多个分组协同开发
创建多个Docket实例即可,且分组不允许重名,在swagger界面下拉框中可以看见
@Beanpublic Docket docket1() {return new Docket(DocumentationType.SWAGGER_2).groupName("村长最帅");}@Beanpublic Docket docket2() {return new Docket(DocumentationType.SWAGGER_2).groupName("测试组");}@Beanpublic Docket docket3() {return new Docket(DocumentationType.SWAGGER_2).groupName("运维组");}
四、配置扫描接口
1、配置扫描接口的好处在于:
1)可以通过Swagger给一些比较难理解的属性或者接口,增加注释信息
2)接口文档实时更新
3)可以在线进行测试
2、给实体类接口添加注释信息
@ApiModel("用户实体类")
public class User {@ApiModelProperty("用户名")public String username; //如果设置私有属性private,在swagger端Models中将不再显示@ApiModelProperty("密码")public String password;
只要我们的接口中,返回值存在实体类,它就会被扫描到swagger中去
如果设置私有属性private,在swagger端Models中将不再显示。但如果设置属性为public,后面又接收不到参数值,也许你会说设置setter,getter方法不就行了,会产生空指针异常。改进如下:
@ApiModel("用户实体类")
public class User {@ApiModelProperty("用户名")private String username; @ApiModelProperty("密码")private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
3、给控制类接口添加注释信息
@Api作用在类上,@ApiOperation作用在方法上
package com.study.controller;import com.study.pojo.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags ="HelloController",description ="Hello控制类") //作用在类上,ApiOperation作用在方法上
@RestController
public class HelloController {@GetMapping("/hello")public String hello(){return "你好呀!";}//只要我们的接口中,返回值存在实体类,它就会被扫描到swagger中去@PostMapping(value="/user")public User user(){return new User();}@ApiOperation("Get传参数")@GetMapping(value = "/hello2")public String hello2(@ApiParam("用户名") String username,@ApiParam("密码") String password){return "hello"+username+password;}@ApiOperation("Post传参数")@PostMapping(value = "/hello3")public User hello2(@ApiParam(value = "用户名",required = true) User user ){return user;}
}
4、测试传参
1)这里传递参数的形式默认是JSON格式的,为什么呢?第一,使用了@RestController注解;第二,在执行测试后,方法体中数据格式是JSON格式的。
2) post方法测试
在输入用户名和密码后,点击执行 ,我们能看到请求的URL和Post方法的响应体
3)get方法测试
点击“Try it out”才能输入参数的值,这里的响应体与Get传参数方法的返回值一致
五、空指针异常
1、第一种情况:Swagger3.0空指针异常,可能由于Springboot版本过高,导致不兼容
有两种可行的解决方案:
1)降低版本,将版本降为2.5.7及以下,在配置类中加上@EnableSwagger2或@EnableOpenApi均可
高版本的Swagger在URL栏中输入:localhost:8080/swagger-ui/index.html;低版本的Swagger在URL栏中输入:localhost:8080/swagger-ui.html
2)添加springfox-boot-starter依赖,在配置类中加上@EnableOpenApi,在启动类上加上@EnableWebMvc注解
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>
在URL栏中输入:localhost:8080/swagger-ui/index.html
2、第二种情况的空指针异常
原因:swagger在生成接口参数记录对象时,会保留参数对象中getter方法的属性,如果又使用public修饰了属性,则会造成冲突
解决方法:将实体类中的public改为private即可或者去掉getter方法
Swagger3.0快速开发及空指针异常的解决相关推荐
- .Net6.0快速开发平台3.4新版源码(教程运行视频齐全),net敏捷开发
.Net6.0快速开发平台3.4新版源码(教程运行视频齐全),net敏捷开发,全网最新有演示,报表设计,大屏设计,流程设计,实时通讯,动态表单,日程管理,APP端,双端代码生成全部具备,是你接外包的利 ...
- Cognos 11.0快速开发指南 Ⅰ
1. 概述 Cognos Analysics 11,是IBM在Cognos BI 10的版本基础上,吸取业界流行的敏捷BI理念,强化了自助式分析的一款强大BI开发平台工具.其官方文档内容丰富,但是较为 ...
- Cognos 11.0快速开发指南
1. 概述 Cognos Analysics 11,是IBM在Cognos BI 10的版本基础上,吸取业界流行的敏捷BI理念,强化了自助式分析的一款强大BI开发平台工具.其官方文档内容丰富,但是较为 ...
- php的miss路由,ThinkPHP6.0 MISS路由 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
MISS路由/默认路由 如果路由匹配失败, 将它重定向到一个指定的路由是个好主意 全局MISS路由 如果路由匹配失败, 将它重定向到一个指定的路由是个好主意 如果希望在没有匹配到所有的路由规则后执行一 ...
- php路由地址,ThinkPHP6.0路由地址 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
路由访问地址 所谓路由地址, 就是用户真实的访问地址, 或者路由表达式的真实映射 路由到控制器/操作 这是最常用的一种路由方式,把满足条件的路由规则路由到相关的控制器和操作,然后由系统调度执行相关的操 ...
- php 模板渲染,ThinkPHP6.0模板渲染 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
模板渲染生成页面 模板渲染, 其实就是生成前端页面 模板路径 默认情况下,框架会自动定位你的模板文件路径,优先定位应用目录下的view目录,这种方式的视图目录下就是应用的控制器目录. 单应用模式 ├─ ...
- 轻流·无代码系统搭建平台 快速开发平台3.4.5 版本 JNPF
轻流 轻流无代码系统搭建平台,拥有完备的组织架构体系,支撑企业有效管理员工信息生命全周期.支持通过SSO对接第三方账号体系.支持同步企业微信.钉钉.飞书等组织架构 集团式部门架构 多级分权的部门结构, ...
- 基于浮云绘图 快速开发车站状态图
高铁.地铁等火车进出车站时,需要实时监控轨道.道岔.信号机等设备的状态,涉及设备数千个,如果形象.实时的展示设备状态,是一个不小的难题. 抽象的图形化的车站站场图,是业内成熟的方式.但是,要么性能(刷 ...
- Jeecg-Boot 2.0.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台
Jeecg-Boot 2.0.0 版本发布,前后端分离快速开发平台 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot ...
最新文章
- zabbix 概念理解
- 滑动换屏——Fragment
- 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验...
- linux permit用法,技术|12 条实用的 zypper 命令范例
- python PyQt5 slot插槽(pyqtSignal、pyqtSlot)
- mysql 建索引_mysql数据库正确建立索引及使用
- 浅谈RDMA流控设计
- python3调用adb命令_如何使用Python执行adb命令?
- android o 跨进程广播,[Android] Android O 广播限制
- OpenGL中的Uniform block size 的大小限制
- Maven项目 之eclipse操作篇
- 扼杀 304,Cache-Control: immutable
- spring boot 对象拷贝工具(Orika)
- 听说你想进玩TikTok?
- java中action类是干嘛的_java中action的作用
- Python爬虫框架Scrapy报错:ModuleNotFoundError: No module named 'scrapy'
- 如何去管理Java项目
- vue项目之页面底部出现白边及空白区域错误记录
- 2018年清华美院交叉学科保研面试经验
- 豆子特斯拉,豆箕宁德时代