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

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.

相关推荐
热点推荐
又有3个中国球员结束留洋回国!曾经都是希望,在欧洲难有竞争力

又有3个中国球员结束留洋回国!曾经都是希望,在欧洲难有竞争力

落夜足球
2024-06-20 22:36:54
事闹大了,南方医科大领导召开紧急会议,俞莉医生疑似被停职。

事闹大了,南方医科大领导召开紧急会议,俞莉医生疑似被停职。

文雅笔墨
2024-06-18 01:43:02
震惊!旁边的同事,猝死了

震惊!旁边的同事,猝死了

蚂蚁大喇叭
2024-06-19 09:44:52
烧光百亿,离奇破产!顶级天才,让广东损失惨重

烧光百亿,离奇破产!顶级天才,让广东损失惨重

金错刀
2024-06-16 15:47:42
绿军下季卫冕7大劲敌:掘金居首 雄鹿森林狼雷霆等不容小觑

绿军下季卫冕7大劲敌:掘金居首 雄鹿森林狼雷霆等不容小觑

醉卧浮生
2024-06-21 07:17:39
巨献!40集《六姊妹》年代剧,群星闪耀,要火的节奏!

巨献!40集《六姊妹》年代剧,群星闪耀,要火的节奏!

花花聊聊
2024-06-20 12:12:20
纪实:河北第一秘书李真,办公室犹如金銮殿,逼4名空姐“献身”

纪实:河北第一秘书李真,办公室犹如金銮殿,逼4名空姐“献身”

祥瑞
2024-05-04 10:05:52
房地产之后,中国即将出现2个新的造富机会:未来20年都是趋势!

房地产之后,中国即将出现2个新的造富机会:未来20年都是趋势!

森林聊商业
2023-06-21 10:10:18
农行董事长谷澍谈人口老龄化:上海网点到店顾客中,超40%的客户超过60岁

农行董事长谷澍谈人口老龄化:上海网点到店顾客中,超40%的客户超过60岁

凤凰网财经plus
2024-06-20 12:29:02
男子银行内放声大哭,买房贷款按时还了9年,还的却全是利息!

男子银行内放声大哭,买房贷款按时还了9年,还的却全是利息!

前海国际
2024-05-23 13:04:49
胡适:无知的人,经历苦难才能觉醒;愚昧的人,死到临头执迷不悟

胡适:无知的人,经历苦难才能觉醒;愚昧的人,死到临头执迷不悟

幸福娃爱扒娱
2024-05-01 09:57:22
谢霆锋的“壮硕身材”,打了多少国产剧“假肌肉男神”的脸

谢霆锋的“壮硕身材”,打了多少国产剧“假肌肉男神”的脸

糊咖娱乐
2024-06-20 09:04:25
刺激!美洲杯除决赛以外的淘汰赛没有加时赛,打平直接进点球大战

刺激!美洲杯除决赛以外的淘汰赛没有加时赛,打平直接进点球大战

直播吧
2024-06-20 13:49:09
中国海警处置菲律宾强闯仁爱礁事件中,惊现三位淡定哥,他们是谁

中国海警处置菲律宾强闯仁爱礁事件中,惊现三位淡定哥,他们是谁

笔墨V
2024-06-20 09:30:05
新能源车亏钱大甩卖,燃油车急了

新能源车亏钱大甩卖,燃油车急了

镜观台
2024-06-19 10:13:32
很多人总担心人民币如果自由兑换,汇率会大跌!

很多人总担心人民币如果自由兑换,汇率会大跌!

火山杂谈
2024-05-09 23:54:21
曝王思聪私生女被王健林接走!黄一鸣再晒女儿视频,被扒全是库存

曝王思聪私生女被王健林接走!黄一鸣再晒女儿视频,被扒全是库存

八卦王者
2024-06-20 11:49:30
崔康熙胆子真大!足协杯让19岁的中超诺伊尔首秀,鲁能为此捡到宝

崔康熙胆子真大!足协杯让19岁的中超诺伊尔首秀,鲁能为此捡到宝

罗掌柜体育
2024-06-20 20:08:56
青岛卓越世纪中心一女子坠楼身亡,当地街道办通报

青岛卓越世纪中心一女子坠楼身亡,当地街道办通报

央广网
2024-06-20 16:40:20
姜萍是否找人代考?达摩院澄清对姜萍很不利,浙大欲言又止

姜萍是否找人代考?达摩院澄清对姜萍很不利,浙大欲言又止

平老师666
2024-06-19 20:59:10
2024-06-21 08:20:49
wRitchie
wRitchie
IT实用技术应用、JAVA
11文章数 12关注度
往期回顾 全部

科技要闻

Claude3.5突然发布!GPT-4o不香了

头条要闻

媒体:普京访问越南 美国气急败坏恨不得直接"叫停"

头条要闻

媒体:普京访问越南 美国气急败坏恨不得直接"叫停"

体育要闻

欧洲杯名画:16岁巨星1V3 如同施魔法

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

普华永道,引火烧身

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

本地
艺术
数码
公开课
军事航空

本地新闻

2024·合肥印象|用崭新视角对话城市发展

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

数码要闻

AMD重启多显卡支持!最多四块、192GB显存

公开课

近视只是视力差?小心并发症

军事要闻

以军发言人公开表示"哈马斯无法被消灭" 以政府反驳

无障碍浏览 进入关怀版