学习目标:
前后端分离
Vue+SpringBoot
后端时代:前端只用管理静态页面;html==>后端。模板引擎 JSP=>后端是主力
前后端分离时代:
产生一个问题:
解决方案
前后端分离:
官网:https://swagger.io/
SpringBoot项目整合swagger2需要用到两个依赖:springfox-swagger2和springfox-swagger-ui,用于自动生成swagger文档。
此版本的亮点:
兼容性说明:
注意:Swagger2.0
和Swagger3.0
有很多区别,下面使用的是Swagger3.0
,有区别的地方会简单说明
swagger3.0以下版本导入这两个就可以了
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>3.0.0version>
dependency>
swagger3.0以上还需要导入,不然无法进入后台界面
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
<version>3.0.0version>
dependency>
创建Controller层写一个HelloController
写一个测试路径hello进行测试,项目是否可以跑起来。
测试地址:http://localhost:8080/
出现下面页面就成功了!
继续学习吧!!!
package com.zhao.swagger.config;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 //开启Swagger2
public class SwaggerConfig {
}
运行程序进行测试
注意:版本不同测试路径
不同
http://localhost:8080/swagger-ui/index.html
http://localhost:8080/swagger-ui.html
Swagger的bean实例Docket;
注意:版本不同注解
不同
package com.zhao.swagger.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
@EnableOpenApi //开启Swagger3.0
public class SwaggerConfig {
//配置swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.OAS_30);
}
}
DocumentationType.OAS_30
这里需要的是一个DocumentationType
类型的参数
我们看一下Docket
源码,找到DocumentationType
去看他的源码
这里找到了我们需要的参数,选择我们使用的即可
我们去看ApiInfo
的源码获取我们需要的信息
配置代码如下(他们对应的信息后面有解释)
//配置Swagger信息apiInfo
private ApiInfo apiInfo() {
//作者信息
Contact contact= new Contact(
"Mr.zhao",
"https://blog.csdn.net/qq_43521797?spm=1011.2124.3001.5343",
"[email protected]");
return new ApiInfo(
"Mr.zhao API文档",
"再小灰尘也能在阳光下起舞",
"v1.0",
"https://blog.csdn.net/qq_43521797?spm=1011.2124.3001.5343",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<>());
}
分析一下接口部分显示信息
信息来自于springfox-swagger-ui-3.0.0.jar
Docket下的select()
//配置swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//RequestHandlerSelectors配置要扫播接口的方式
//basePackage指定要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.zhao.swagger.controller"))
//paths()过滤什么路径
.paths(PathSelectors.ant("/zhao/**"))
.build();
}
RequestHandlerSelectors,扫描接口的方式。我们去RequestHandlerSelectors
的源码看看其他配置方法
和上面一样我们去源码中看他的方法有哪些
我们在Docket的源码中科院看到enabled=true
这个属性就是控制启动
我们去改变一下他的值 改成false关闭一下试试
注意:下面红框的是一个整体不能在吗中间添加其他东西。
我们在.apiInfo(apiInfo())
后面进行添加.enable(false)
@Bean
public Docket docket(){
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.enable(false)//关闭Swagger
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhao.swagger.controller"))
.build();
}
测试地址:http://localhost:8080/swagger-ui/index.html#/
关闭后的效果
我们在项目中只在开发环境开启Swagger,生产环境就要关闭Swagger。
下面我们进行设置一下
spring.profiles.active=dev
server.port=8081
server.port=8082
Profiles.of()
设置要显示的swagger的环境
通过environment.acceptsProfiles
判断是否处在自己设定的环境中 获取boolean
值flag
赋值给enable(flag)
//配置swagger的Docket的bean实例
@Bean
public Docket docket(Environment environment){
//设置要显示的swagger的环境
Profiles profiles =Profiles.of("dev");
//通过environment.acceptsProfiles判断是否处在自己设定的环境中
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.enable(flag)
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhao.swagger.controller"))
.build();
}
我们先测试dev环境
application.properties中切换环境为dev环境: spring.profiles.active=dev
这次测试pro环境
application.properties中切换环境为pro环境: spring.profiles.active=pro
我继续看Docket的源码我们可以看到分组的默认值为default
下面我们进行修改,指需要一行代码
.groupName("Mr.zhao")
多个分组就是多人协作开发时每个人分组
其实就是多个Docket实例
下面我们测试一下
我们在复制几个Docket实例进行测试
@Bean
public Docket docket1(Environment environment){
return new Docket(DocumentationType.OAS_30).groupName("A");
}
@Bean
public Docket docket2(Environment environment){
return new Docket(DocumentationType.OAS_30).groupName("B");
}
@Bean
public Docket docket3(Environment environment){
return new Docket(DocumentationType.OAS_30).groupName("C");
}
运行一下就可以看到多个分组了,选择一个分组信息就会发生变化,以及测试路径。
接口常用的三个注解
@Api(tags = "helloController层")
:放在控制层类上,描述控制层@ApiOperation(value = "hello2方法",notes = "方法描述")
:放在方法控制层上,描述控制层方法@ApiParam("用户名")
:参数描述package com.zhao.swagger.controller;
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层")
@RestController
public class HelloController {
@ApiOperation("hello方法")
@PostMapping("/hello")
public String hello(){
return "hello Swagger";
}
@ApiOperation(value = "hello2方法",notes = "方法描述")
@GetMapping("/hello2")
public String hello2(@ApiParam("用户名") String username){
return username;
}
}
我们先创建pojo编写一个User进行测试
package com.zhao.swagger.pojo;
public class User {
private String username;
private String password;
}
我们直接启动项目看看可以扫描我们的实体类吗?答案是不能
方法一(不是用注解,也可以扫描到实体类)
实体类不使用注释也可以被扫描,只要请求返回类型是实体类即可。我们测试一下
我写一个方法
@ApiOperation(value = "user方法",notes = "测试不使用注解,把实体类作为返回值可以扫描到实体类吗")
@GetMapping("/user")
public User user(){
return new User();
}
实体有了但是这样的没有属性,这是因为没有给属性添加get set方法,
给是实体类添加get set 方法,再次测试
package com.zhao.swagger.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
public class User {
private String username;
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;
}
}
方法二(注解)
@ApiModel("用户实体类")
:用于实体类上,描述实体类@ApiModelProperty(value = "用户名",hidden = false)
:用于属性上描述实体类属性,hidden功能是,是否隐藏该属性package com.zhao.swagger.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("用户实体类")
public class User {
@ApiModelProperty(value = "用户名",hidden = false)//hidden是否隐藏
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}