一.Swagger
1.Swagger簡介
swagger 是一款RESTFUL接口的文檔在線自動生成+功能測試功能軟件.
Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務??傮w目標是使客戶端和文件系統(tǒng)作為服務器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務器端的代碼,允許API來始終保持同步。Swagger 讓部署管理和使用功能強大的API從未如此簡單.
2.Swagger注解
-
@Api:用在請求的類上,表示對類的說明
- tags="說明該類的作用,可以在UI界面上看到的注解"
- value="該參數(shù)沒什么意義,在UI界面上也看到,所以不需要配置"
@Api(tags="APP用戶注冊Controller") -
@ApiOperation:用在請求的方法上,說明方法的用途、作用
- value="說明方法的用途、作用"
- notes="方法的備注說明"
@ApiOperation(value="用戶注冊",notes="手機號、密碼都是必輸項,年齡隨邊填,但必須是數(shù)字") -
@ApiParam:用于方法,參數(shù),字段說明,表示對參數(shù)的添加元數(shù)據(說明或是否必填等)
- name:屬性名稱
- value:屬性值
- defaultValue:默認屬性值
- required:是否屬性必填
- example:舉例子
@ApiOperation(value = "傳設置過期時間") @RequestMapping(value = "/expire", method = RequestMethod.POST) public boolean expire(@ApiParam(name = "key", value = "cache key", required = true) @RequestParam("key")String key,@ApiParam(name = "expireSecond", value = "key過期時間:秒", required = true)@RequestParam("expireSecond") Integer expireSecond){ checkParams(key); log.info("key:{},", key); return redisService.expire(key, expireSecond); } -
@ApiImplicitParams:用在請求的方法上,表示一組參數(shù)說明
- @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一個請求參數(shù)的各個方面
- name:參數(shù)名
- value:參數(shù)的漢字說明、解釋
- required:參數(shù)是否必須傳
- paramType:參數(shù)放在哪個地方
- header --> 請求參數(shù)的獲?。篅RequestHeader
- query --> 請求參數(shù)的獲?。篅RequestParam
- path(用于restful接口)--> 請求參數(shù)的獲?。篅PathVariable
- body(不常用)
- form(不常用)
- dataType:參數(shù)類型,默認String,其它值dataType="Integer"
- defaultValue:參數(shù)的默認值
@ApiImplicitParams({ @ApiImplicitParam(name="mobile",value="手機號",required=true,paramType="form"), @ApiImplicitParam(name="password",value="密碼",required=true,paramType="form"), @ApiImplicitParam(name="age",value="年齡", required=true,paramType="form",dataType="Integer") }) - @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一個請求參數(shù)的各個方面
-
@ApiResponses:用在請求的方法上,表示一組響應
- @ApiResponse:用在@ApiResponses中,一般用于表達一個錯誤的響應信息
- code:數(shù)字,例如400
- message:信息,例如"請求參數(shù)沒填好"
- response:拋出異常的類
@ApiOperation(value = "select1請求",notes = "多個參數(shù),多種的查詢參數(shù)類型") @ApiResponses({ @ApiResponse(code=400,message="請求參數(shù)沒填好"), @ApiResponse(code=404,message="請求路徑沒有或頁面跳轉路徑不對") }) - @ApiResponse:用在@ApiResponses中,一般用于表達一個錯誤的響應信息
-
@ApiModel:用于響應類上,表示一個返回響應數(shù)據的信息(這種一般用在post創(chuàng)建的時候,使用@RequestBody這樣的場景,請求參數(shù)無法使用@ApiImplicitParam注解進行描述的時候)
- @ApiModelProperty:用在屬性上,描述響應類的屬性
@ApiModel(description= "返回響應數(shù)據") public class RestMessage implements Serializable{ @ApiModelProperty(value = "是否成功") private boolean success=true; @ApiModelProperty(value = "返回對象") private Object data; @ApiModelProperty(value = "錯誤編號") private Integer errCode; @ApiModelProperty(value = "錯誤信息") private String message; /* getter/setter */ }
二.SpringBoot整合Swagger
1.新建SpringBoot項目

01.jpg

02.jpg
2.添加依賴
<!--SpringBoot整合mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
- 添加依賴后的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ym</groupId>
<artifactId>spring_boot_swagger</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring_boot_swagger</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--SpringBoot整合mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.resource包下新建application.yml文件
- 也可以使用application.properties進行配置
server:
port: 8080
# 指定端口
spring:
# 配置數(shù)據源
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3307/datatest?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
# 配置mybatis
mybatis:
type-aliases-package: com.ym.pojo
mapper-locations: classpath*:mapper/*Mapper.xml
# 日志
logging:
level:
root: info #使用error級別,項目啟動不起來,原因還在排查中
file:
path: mylog #日志文件所在的包路徑
# 配置swagger
swagger:
basePackage: com.ym
title: User CRUD SpringBoot Swagger
version: v1.0
description: this is a user crud function
contact: YanM
url: www.ym.com
4.創(chuàng)建swagger2的配置類
package com.ym.config;
import org.springframework.beans.factory.annotation.Value;
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.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value ("${swagger.basePackage}")
private String basePackage; //掃描controller的包名
@Value ("${swagger.title}")
private String title; //在線文檔的標題
@Value ("${swagger.version}")
private String version; //文檔的版本
@Value ("${swagger.description}")
private String description; //在線文檔的描述
@Value ("${swagger.contact}")
private String contact; //聯(lián)系人
@Value ("${swagger.url}")
private String url; //URL
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()) //函數(shù)返回一個ApiSelectorBuilder實例來控制哪些接口暴露給swagger來展現(xiàn)
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title(title)
.description(description)
.termsOfServiceUrl(url)
.version(version)
.contact(new Contact(contact,url,url))
.build();
}
}
5.pojo層
package com.ym.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int uid;
private String name;
private String sex;
private int age;
private String address;
}
6.dao層接口
- 接口上需要@Mapper注解
package com.ym.dao;
import com.ym.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface IUserDao {
List<User> getAllUsers();
User getUserByUid(int uid);
int editUser(User user);
int deleteUserByUid(int uid);
int saveUser(User user);
}
7.與dao層接口對應的mapper文件
- 最好在添加一個resultMap
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 整個映射文件為mapper節(jié)點,里面包含namespace屬性 -->
<mapper namespace="com.ym.dao.IUserDao">
<sql id="all">
select * from users
</sql>
<select id="getAllUsers" resultType="user">
<include refid="all" />
</select>
<select id="getUserByUid" resultType="user">
select * from users where uid=#{uid}
</select>
<update id="editUser">
update users
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="sex != null and sex != ''">
sex = #{sex},
</if>
<if test="age != 0">
age = #{age},
</if>
<if test="address != null and address != ''">
address = #{address},
</if>
</set>
where uid = #{uid}
</update>
<delete id="deleteUserByUid">
delete from users where uid=#{uid}
</delete>
<insert id="saveUser">
insert into users values (default ,#{name},#{sex},#{age},#{address})
</insert>
</mapper>
8.service層接口
package com.ym.service;
import com.ym.pojo.User;
import java.util.List;
public interface IUserService {
List<User> getAllUsers();
int editUser(User user);
int deleteUserByUid(int uid);
int saveUser(User user);
}
9.service層實現(xiàn)類
package com.ym.service.impl;
import com.ym.dao.IUserDao;
import com.ym.pojo.User;
import com.ym.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService implements IUserService {
@Resource
private IUserDao userDao;
@Override
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
@Override
public User getUserByUid(int uid) {
return userDao.getUserByUid(uid);
}
@Override
public int editUser(User user) {
return userDao.editUser(user);
}
@Override
public int deleteUserByUid(int uid) {
return userDao.deleteUserByUid(uid);
}
@Override
public int saveUser(User user) {
return userDao.saveUser(user);
}
}
10.controller層
package com.ym.controller;
import com.ym.pojo.User;
import com.ym.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@Api(tags = "操作用戶信息-UserController")
public class UserController {
@Resource
private IUserService userService;
@GetMapping("/allUser")
@ApiOperation(value = "獲取所有的用戶信息")
public List<User> queryAllUser(){
List<User> users = userService.getAllUsers();
return users;
}
@PostMapping("/editUser")
@ApiOperation(value = "修改用戶信息")
public void editUser(User user){
userService.editUser(user);
}
@GetMapping("/deleteUser/{uid}")
@ApiOperation(value = "刪除用戶")
public void deleteUser(@PathVariable int uid){
userService.deleteUserByUid(uid);
}
@PostMapping("/saveUser")
@ApiOperation(value = "保存用戶信息")
public void saveUser(User user){
userService.saveUser(user);
}
}
11.Swagger訪問
- 在地址欄中輸入下面地址就可以訪問(SpringBoot)
http://localhost:8080/swagger-ui.html

swagger訪問.jpg

swagger訪問2.jpg
12.目錄結構

SpringBoot+Swagger目錄結構.jpg