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

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-04-22 12:35:05
猪大肠被关注!研究发现:糖尿病患者常吃猪大肠,或有5种变化

猪大肠被关注!研究发现:糖尿病患者常吃猪大肠,或有5种变化

芹姐说生活
2026-05-01 14:34:43
突发!CPO算力大利空!A股恐变天?

突发!CPO算力大利空!A股恐变天?

龙行天下虎
2026-05-03 00:49:46
朱婷拼尽全力!科内卫冕失败无缘世俱杯,瓦基弗两门重炮合砍65分

朱婷拼尽全力!科内卫冕失败无缘世俱杯,瓦基弗两门重炮合砍65分

排球黄金眼
2026-05-03 01:14:52
美国警告赖清德当局,只要大陆决定武力统一,台湾的结局只有一个

美国警告赖清德当局,只要大陆决定武力统一,台湾的结局只有一个

猫女的小树屋
2026-05-02 10:14:06
对前妻无性冷暴力,猴哥转身搂22岁新欢,他不是不生是不想跟你生

对前妻无性冷暴力,猴哥转身搂22岁新欢,他不是不生是不想跟你生

一盅情怀
2026-05-02 16:11:07
高血脂要少吃白菜,越吃血管越细?医生:3种素菜高血脂患者少碰

高血脂要少吃白菜,越吃血管越细?医生:3种素菜高血脂患者少碰

新时代的两性情感
2026-05-02 22:26:56
伊朗战争,全世界才知道我国掌握三个杀手锏,早就是世界第一了

伊朗战争,全世界才知道我国掌握三个杀手锏,早就是世界第一了

揭秘历史的真相
2026-04-29 21:32:06
《寒战1994》票房第一,看完后我想说:吴彦祖把港片的大门踹烂了

《寒战1994》票房第一,看完后我想说:吴彦祖把港片的大门踹烂了

一娱三分地
2026-05-01 18:07:10
白宫称与伊朗敌对行动已“结束”!美军在中东8国16处军事设施受损,特朗普:“不满意”伊朗最新谈判方案

白宫称与伊朗敌对行动已“结束”!美军在中东8国16处军事设施受损,特朗普:“不满意”伊朗最新谈判方案

纵相新闻
2026-05-02 09:28:07
韩国瑜不听指挥,背刺郑丽文,配合“台独”军购,大陆一锤定音

韩国瑜不听指挥,背刺郑丽文,配合“台独”军购,大陆一锤定音

跳跳历史
2026-05-03 02:05:03
柜员转走1800万后续:员工被批捕,银行改口,曾称你就赶上了

柜员转走1800万后续:员工被批捕,银行改口,曾称你就赶上了

别人都叫我阿腈
2026-05-02 09:49:25
我们全家改签去欧洲过年,二叔带着18口人扑空三亚机场

我们全家改签去欧洲过年,二叔带着18口人扑空三亚机场

晓艾故事汇
2026-04-22 10:11:59
看完吴越的家,总算明白她为啥都53岁了,还不想找对象

看完吴越的家,总算明白她为啥都53岁了,还不想找对象

阿废冷眼观察所
2026-05-02 18:00:22
男女相处,最要紧的一件事——能搂就搂,能抱就抱,千万别疏远了

男女相处,最要紧的一件事——能搂就搂,能抱就抱,千万别疏远了

皓皓情感说
2026-04-27 07:05:06
悲哀!38.8万彩礼加20万下车礼,新娘进门清礼金,新郎坐旁吃残羹

悲哀!38.8万彩礼加20万下车礼,新娘进门清礼金,新郎坐旁吃残羹

火山詩话
2026-05-02 06:53:57
浙江女子15年前买的金条竟是烂铜废铁,维权陷罗生门只能组团追责

浙江女子15年前买的金条竟是烂铜废铁,维权陷罗生门只能组团追责

观世记
2026-05-02 15:53:17
知名女演员李心艾暴瘦80斤,颧骨突出双颊凹陷,与产后形象反差巨大,网友:不敢认!

知名女演员李心艾暴瘦80斤,颧骨突出双颊凹陷,与产后形象反差巨大,网友:不敢认!

极目新闻
2026-04-30 15:18:21
画质对决一边倒!英伟达技术吊打AMD 差距肉眼可见

画质对决一边倒!英伟达技术吊打AMD 差距肉眼可见

游民星空
2026-05-01 23:27:30
炎亚纶凌晨发长文清算16年恩怨:决裂汪东城、官宣结婚告别飞轮海

炎亚纶凌晨发长文清算16年恩怨:决裂汪东城、官宣结婚告别飞轮海

一盅情怀
2026-05-01 15:51:15
2026-05-03 04:39:00
wRitchie
wRitchie
IT实用技术应用、JAVA
11文章数 12关注度
往期回顾 全部

科技要闻

AI热潮耗尽库存,Mac Mini起售调高200美元

头条要闻

父母互相拍照 6岁儿子失足坠落20米山崖

头条要闻

父母互相拍照 6岁儿子失足坠落20米山崖

体育要闻

休赛期总冠军,轮到休斯顿火箭

娱乐要闻

高圆圆赵又廷游三亚 牵手逛街好甜蜜

财经要闻

雷军很努力 小米还是跌破了30港元大关

汽车要闻

同比大涨190% 方程豹4月销量29138台

态度原创

艺术
时尚
手机
游戏
教育

艺术要闻

看!海夫兰笔下的美女,令人惊艳的艺术之美!

连衣裙还得是“法式”,性感妩媚却不轻浮

手机要闻

拯救者手机Y70新一代本月发布!骁龙8 Gen5+2K屏 功耗比友商1.5K还低

合作恐怖《Devil of the Plague》登陆Steam EA

教育要闻

高考地理:45个地理名词及概念

无障碍浏览 进入关怀版