网易首页 > 网易号 > 正文 申请入驻

SpringBoot 2.1.4与Swagger2的集成生成RESTful接口文档

0
分享至

SpringBoot 2.1.4与Swagger2的集成生成RESTful接口文档

来源:http://www.bj9420.com

编者: wRitchie(吴理琪)

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful风格的Web服务。总体目标是使客户端的接口文档与服务端接口同步更新,当我们在后台的接口修改了后,Swagger可以实现自动的更新,而不需要人为的维护这个接口进行测试。接口文档的方法,参数和模型紧密集成到服务器端的代码,允许API始终保持同步。

第一步:pom.xml添加依赖,引入jar包:

Swagger版本声明


2.9.2

版本依赖:


io.springfox
springfox-swagger-ui
${swagger2.version}
io.springfox
springfox-swagger2
${swagger2.version}
第二步:Swagger的配置启动类编写:

使用Swagger需进行一些配置,编写配置启动类Swagger2.java,配置相关信息将在Swagger接口首页上显示,类似于接口说明书,在Swagger2类中使用注解来进行启动Swagger,注意,在SpringBoot的启动类如SmApplication.java同级创建Swagger2.java

Swagger2.java具体配置如下:

package com.bj9420;
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;
/**
* @Title: Swagger2.java
* @Description: Swagger2的配置文件 http://IP:端口/swagger-ui.html
* http://localhost:8081/swagger-ui.html
* @author: wRitchie
* @date: 2019/1/4 15:07
* @version: V1.0
* @Copyright (c): 2019 http://bj9420.com All rights reserved.
*/
@Configuration
@EnableSwagger2
public class Swagger2 {
@Value("${swagger2.enable}")
private boolean enable;
/**swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.bj9420.controller"))
.paths(PathSelectors.any())
.build().enable(enable);
}
/**构建 api文档的详细信息函数,注意这里的注解引用的是哪个*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("SM项目RESTful API文档")
//创建人
.contact(new Contact("wRitchie", "http://www.bj9420.com", "408873941@qq.com"))
//版本号
.version("1.0.0")
//描述
.description("SM项目接口文档,本项目所有文档终以在线的形式提供,如有疑问,请及时有我们联系,本文档将实时更新,确保最新版的接口可用。")
.build();
}
}

其中: .apis(RequestHandlerSelectors.basePackage("com.bj9420.controller"))指定了以扫描包的方式进行,会把com.bj9420.controller包下的controller都扫描到。

第三步:使用Swagger来进行模拟测试,主要是在controller层,实例如下:
package com.bj9420.controller.user;
import com.bj9420.framework.SystemConstant;
import com.bj9420.framework.util.AESUtil;
import com.bj9420.framework.util.MD5Util;
import com.bj9420.framework.util.StringUtil;
import com.bj9420.model.Result;
import com.bj9420.model.User;
import com.bj9420.service.user.IUserService;
import io.swagger.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Title: UserController.java
* @Description: 用户控制类,使用Swagger2提供接口文档范本
* @author: wRitchie
* @date: 2019/1/4 15:14
* @version: V1.0
* @Copyright (c): 2019 http://bj9420.com All rights reserved.
*/
@Api(value = "用户控制类", tags = "用户控制类")
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
private static final Logger log = LoggerFactory.getLogger(UserController.class);
/**注意:paramType需要指定为path,不然不能正常获取*/
@ApiOperation(value = "查询用户信息", notes = "根据用户标识查询用户信息")
@ApiImplicitParam(name = "userId", value = "用户标识", paramType = "path", dataType = "Integer")
@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable Integer userId) {
log.info("开始查询某个用户信息");
return userService.selectByPrimaryKey(userId);
}
/**注意:paramType需要指定为body*/
@ApiOperation(value = "新建用户", notes = "新建一个用户")
@ApiImplicitParams({@ApiImplicitParam(name = "user", value = "用户数据", required = true, paramType = "body", dataType = "User") })
//@RequestMapping(value = "", method = RequestMethod.POST)
@PostMapping("")
public Result addUser(@ApiParam(value = "用户数据", required = true) @RequestBody User user) {
/**模拟客户端app生成的md5密码,实现后台用户与app用户密码的一致性*/
String pwdTmp=MD5Util.encode(user.getPassword());
String sKey = MD5Util.md5(SystemConstant.SYSTEM_SKEY).substring(0, 16);
String pwdEncrypt = AESUtil.encrypt(pwdTmp, sKey).substring(0, 16);
user.setPassword(pwdEncrypt);
int returnValue = userService.insert(user);
if (returnValue > 0) {
return Result.success("新建用户成功。",user);
}else{
return Result.failure("新建用户失败。",null);
}
}
@ApiOperation(value = "获取用户列表", notes = "分页查询获取用户列表信息")
@ApiImplicitParams({@ApiImplicitParam(name = "map",value = "用户数据Map形式",dataType = "Map")})
@GetMapping("")
public Map listByPager(@RequestParam Map map) {
Map jsonMap = new HashMap();
/************* 分页处理 ****************/
//draw : 表示请求次数
String draw=map.get("draw")+"";
//start :第一条数据的起始位置,比如0代表第一条数据
String start=map.get("start")+"";
//length:告诉服务器每页显示的条数
String length=map.get("length")+"";
//排序字段名称
String sortname=map.get("sortname")+"";
//排序升降
String sortorder=map.get("sortorder")+"";
//是否分页标记
String pager=map.get("pager")+"";
if (StringUtil.isEmpty(draw)) {
draw = "0";
}
if(StringUtil.isEmpty(start)) {
start="0";
}
if (StringUtil.isEmpty(length)) {
length = SystemConstant.PAGER_SIZE;
}
if (StringUtil.isEmpty(pager)) {
pager = null;
}
map.put("start", start);
map.put("len", length);
// 排序
String orderbyStr=null;
if(!StringUtil.isEmpty(sortname)){
if("createTime".equals(sortname)){
orderbyStr="order by create_time "+sortorder;
}else if("modifyTime".equals(sortname)){
orderbyStr="order by modify_time "+sortorder;
}else if("userId".equals(sortname)){
orderbyStr="order by user_id "+sortorder;
}else if("loginName".equals(sortname)){
orderbyStr="order by login_name "+sortorder;
}else if("realName".equals(sortname)){
orderbyStr="order by real_name "+sortorder;
}else if("sex".equals(sortname)){
orderbyStr="order by sex "+sortorder;
}else if("orgName".equals(sortname)){
orderbyStr="order by org_id "+sortorder;
}else if("phoneNumber".equals(sortname)){
orderbyStr="order by phone_number "+sortorder;
}else if ("userStatus".equals(sortname)) {
orderbyStr = "order by userStatus " + sortorder;
}
}else{
orderbyStr="order by user_id desc";
}
map.put("pager", pager);
map.put("orderBy", orderbyStr);
List list = userService.selectByPager(map);
int allSize =userService.selectByPagerCount(map);
jsonMap.put("draw", draw);
jsonMap.put("start", start);
jsonMap.put("length", length);
jsonMap.put("sortorder", sortorder);
jsonMap.put("sortname", sortname);
jsonMap.put("pager", pager);
//具体的数据对象数组
jsonMap.put("data", list);
// 总记录数
jsonMap.put("recordsTotal", allSize);
return jsonMap;
}
@ApiOperation(value = "删除用户", notes = "根据用户ID删除用户")
@ApiImplicitParam(name = "userId", value = "用户标识", paramType = "path", dataType = "Integer")
@RequestMapping(value = "/{userId}", method = RequestMethod.DELETE)
public String delUser(@PathVariable int userId) {
int returnValue = userService.deleteByPrimaryKey(userId);
if (returnValue > 0) {
return "删除成功。";
}
return "删除失败。";
}
@ApiOperation(value = "更新用户", notes = "更新已存在用户")
@ApiImplicitParam(name = "user", value = "用户数据", required = true, paramType = "body", dataType = "User")
@RequestMapping(value = "", method = RequestMethod.PUT)
public Result update(@RequestBody User user) {
int returnValue = userService.updateByPrimaryKeySelective(user);
if (returnValue > 0) {
return Result.success("更新用户成功。",user);
}else{
return Result.failure("更新户失败。",null);
}
}
}

Swagger2相关注解介绍

1. @Api:用在类上,说明该类的作用

2. @ApiOperation:用在方法上,说明方法的作用

3. @ApiImplicitParams:用在方法上包含一组参数说明

4. @ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面

paramType:参数放在哪个地方

· header --> 请求参数的获取:@RequestHeader

· query -->请求参数的获取:@RequestParam

· path(用于restful接口)--> 请求参数的获取:@PathVariable

· body(不常用)

· form(不常用)

name:参数名

dataType:参数类型

required:参数是否必须传

value:参数的意思

defaultValue:参数的默认值

5. @ApiResponses:用于表示一组响应

6. @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息

code:数字,例如400

message:信息,例如"请求参数没填好"

response:抛出异常的类

7. @ApiModel:描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)

8. @ApiModelProperty:描述一个model的属性

第四步:启动应用,浏览器访问:http://localhost:8081/swagger-ui.html,正常展示 api 接口文档界面,如下:

第五步,实际应用,选择相应的接口,点击Try it out按钮,输入相关参数,点击Execute,即可看到返回结果,如下图所示:

结论:这样很方便,不用像postman一样来编写入口,Swagger2自动完成,而且实时更新。至此Swagger2与SpringBoot集成完毕。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
齐达内挂帅法国首秀引爆球市,八万门票售罄,宿命对决意大利

齐达内挂帅法国首秀引爆球市,八万门票售罄,宿命对决意大利

星耀国际足坛
2026-08-02 22:59:26
杀人诛心!73岁李修贤炮轰周星驰:无儿无女无家庭,赚多少都没用

杀人诛心!73岁李修贤炮轰周星驰:无儿无女无家庭,赚多少都没用

林雁飞
2026-08-02 22:49:03
乌克兰不停手,第14个“野莓”仓库被击中,损失该谁来赔偿?

乌克兰不停手,第14个“野莓”仓库被击中,损失该谁来赔偿?

山河路口
2026-08-02 18:14:16
王虹的成就是否超越了她的导师

王虹的成就是否超越了她的导师

林子说事
2026-08-03 18:37:27
杨瀚森新队友来了!开拓者官宣签约索汉 一年无保障合同竞争上岗

杨瀚森新队友来了!开拓者官宣签约索汉 一年无保障合同竞争上岗

罗说NBA
2026-08-03 05:53:54
小米澎程72小时战报分析,雷军满意吗?

小米澎程72小时战报分析,雷军满意吗?

科技锋说
2026-08-03 11:20:16
年税收4亿,发工资要花26亿:一个县城的财政账本撕开了多大口子

年税收4亿,发工资要花26亿:一个县城的财政账本撕开了多大口子

冰语历史
2026-08-01 12:56:47
太意外!今天的A股,信号已经很明显了!

太意外!今天的A股,信号已经很明显了!

星图金融研究院
2026-08-03 15:48:41
海灯法师77岁,凭借二指禅倒立走红,圆寂多年后,徒弟说出真相

海灯法师77岁,凭借二指禅倒立走红,圆寂多年后,徒弟说出真相

大运河时空
2026-08-02 09:30:03
官宣!蔚来新车将于8月2日再度开售,价格仅27.48万元起

官宣!蔚来新车将于8月2日再度开售,价格仅27.48万元起

生活魔术专家
2026-08-03 19:19:35
机密文件运达?菲律宾6大银行交出莎拉账目后,丈夫终于出面了

机密文件运达?菲律宾6大银行交出莎拉账目后,丈夫终于出面了

谛听骨语本尊
2026-08-03 16:40:18
利用信息化项目承揽谋利!香洲区原政数局局长李伟被开除公职

利用信息化项目承揽谋利!香洲区原政数局局长李伟被开除公职

南方都市报
2026-08-03 17:38:05
今天才知道,张柏芝同意陈冠希拍照,竟是这3个现实又露骨的原因

今天才知道,张柏芝同意陈冠希拍照,竟是这3个现实又露骨的原因

秋姐居
2026-07-30 19:30:12
吴清最新演讲全文

吴清最新演讲全文

新京报
2026-08-03 11:11:22
婚外胚胎案最让人破防的一幕,丈夫选胚胎,女儿录取通知书到了

婚外胚胎案最让人破防的一幕,丈夫选胚胎,女儿录取通知书到了

宝哥精彩赛事
2026-08-02 15:50:12
小米徐洁云发文:“要鼓励真牛逼,打击真牛逼”

小米徐洁云发文:“要鼓励真牛逼,打击真牛逼”

凤凰网科技
2026-08-03 10:38:35
杨澜肠子悔青了?当年嫌弃的普通前夫,竟悄悄活成了人人羡慕的人生赢家

杨澜肠子悔青了?当年嫌弃的普通前夫,竟悄悄活成了人人羡慕的人生赢家

东方不败然多多
2026-08-01 16:45:03
主导对乌轰炸,俄罗斯空天军总司令疑在莫斯科最贵餐厅被炸身亡!

主导对乌轰炸,俄罗斯空天军总司令疑在莫斯科最贵餐厅被炸身亡!

影孖看世界
2026-08-02 23:49:17
iPhone18全面背刺,iPhone17用户直呼买早了!

iPhone18全面背刺,iPhone17用户直呼买早了!

叮当当科技
2026-08-03 00:23:52
日本女偶像被队友背叛外泄私密片,她气愤退团宣布下海:让你们认识真正的我!粉丝傻眼了。。

日本女偶像被队友背叛外泄私密片,她气愤退团宣布下海:让你们认识真正的我!粉丝傻眼了。。

日本物语
2026-07-31 22:59:33
2026-08-03 20:36:49
wRitchie
wRitchie
IT实用技术应用、JAVA
11文章数 12关注度
往期回顾 全部

科技要闻

“像魔法一样”的AI,只卖几分钱

头条要闻

3名辅警在非管辖区查醉驾"以罚代刑"致1死 还多次收钱

头条要闻

3名辅警在非管辖区查醉驾"以罚代刑"致1死 还多次收钱

体育要闻

马克龙介入FIFA危机 致电因凡蒂诺勿搞分裂

娱乐要闻

陈璇半蹲采访诺兰惹争议

财经要闻

大婚前夜 450亿基金爆仓

汽车要闻

00后搞钱成功后的第一台车,真的不是BBA

态度原创

教育
健康
手机
旅游
公开课

教育要闻

北京中考数学,0的倒数是?

干细胞和衰老有什么联系?

手机要闻

荣耀Robot Phone手机核心配置曝光,8月12日发布

旅游要闻

赛里木湖自驾服务费争议尘埃落定,生态账与民生账如何兼得? 文旅观察

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版