- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java利用Swagger2自动生成对外接口的文档由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦.
swagger是一款方便展示的api文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为.
swagger目前有两种swagger和swagger2两种,1比较麻烦,所以不考虑使用。本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅.
1、使用传统的springmvc整合swagger2 。
1、maven依赖 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<!--springfox依赖-->
<dependency>
<groupid>com.fasterxml.jackson.core</groupid>
<artifactid>jackson-core</artifactid>
<version>
2.8
.
0
</version>
</dependency>
<dependency>
<groupid>com.fasterxml.jackson.core</groupid>
<artifactid>jackson-databind</artifactid>
<version>
2.6
.
3
</version>
</dependency>
<dependency>
<groupid>com.fasterxml.jackson.core</groupid>
<artifactid>jackson-annotations</artifactid>
<version>
2.6
.
3
</version>
</dependency>
<dependency>
<groupid>io.springfox</groupid>
<artifactid>springfox-swagger2</artifactid>
<version>
2.4
.
0
</version>
</dependency>
<dependency>
<groupid>io.springfox</groupid>
<artifactid>springfox-swagger-ui</artifactid>
<version>
2.4
.
0
</version>
</dependency>
|
2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):
1
2
3
|
<!-- swagger静态文件路径 -->
<mvc:resources location=
"classpath:/meta-inf/resources/"
mapping=
"swagger-ui.html"
/>
<mvc:resources location=
"classpath:/meta-inf/resources/webjars/"
mapping=
"/webjars/**"
/>
|
注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置,一定要springmvc先拦截到,然后界面才会显示的.
3、然后是swagger2的配置类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@configuration
@enableswagger2
public
class
swaggerconfig
extends
webmvcconfigurationsupport {
@bean
public
docket createrestapi() {
return
new
docket(documentationtype.swagger_2)
.apiinfo(apiinfo())
.select()
.apis(requesthandlerselectors.basepackage(
"net.laoyeyey.yyblog"
))
.paths(pathselectors.any())
.build();
}
private
apiinfo apiinfo() {
return
new
apiinfobuilder()
.title(
"yyblog项目 restful apis"
)
.description(
"yyblog项目api接口文档"
)
.version(
"1.0"
)
.build();
}
}
|
注意:paths如果在生产情况下可以调整为pathselectors.none(),即不显示所有接口信息; 。
4、接口信息配置 。
即在springmvc的controller中配置相关的接口信息 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@controller
@requestmapping
(value =
"aitou"
)
@api
(description =
"测试服务-账户信息查询"
)
public
class
dailyoperationdatacontroller {
logger logger = logger.getlogger(dailyoperationdatacontroller.
class
);
@autowired
private
dailyoperationdataservice dailyoperationdataservice;
/*
* @apioperation(value = "接口说明", httpmethod ="接口请求方式", response ="接口返回参数类型", notes ="接口发布说明"
* @apiparam(required = "是否必须参数", name ="参数名称", value ="参数具体描述"
*/
@apioperation
(value =
"账户信息查询接口"
)
@requestmapping
(method ={requestmethod.post,requestmethod.get}, value=
"/query/dailydata/{datadate}"
)
@responsebody
public
dailyoperationdatadto getdailyreportbydatadate(
@pathvariable
(
"datadate"
) string datadate) {
try
{
return
dailyoperationdataservice.getdailyreportbydatadate(datadate);
}
catch
(exception e) {
logger.error(e.getmessage(), e);
}
return
null
;
}
}
|
注:通常情况下swagger2会将扫描包下所有的接口展示出来,这里我是对外的接口是单独一个包,避免展示过多的接口,当然接口方法也可以让它不展示。可以在下面看到相关的注解中有写.
常用的一些注解 。
@api:用在类上,说明该类的作用 @apioperation:用在方法上,说明方法的作用 @apiimplicitparams:用在方法上包含一组参数说明 @apiimplicitparam:用在 @apiimplicitparams 注解中,指定一个请求参数的各个方面 paramtype:参数放在哪个地方 · header --> 请求参数的获取:@requestheader · query -->请求参数的获取:@requestparam · path(用于restful接口)--> 请求参数的获取:@pathvariable · body(不常用) · form(不常用) name:参数名 datatype:参数类型 required:参数是否必须传 value:参数的意思 defaultvalue:参数的默认值 @apiresponses:用于表示一组响应 @apiresponse:用在@apiresponses中,一般用于表达一个错误的响应信息 code:数字,例如400 message:信息,例如"请求参数没填好" response:抛出异常的类 @apiparam:单个参数描述 @apimodel:描述一个model的信息,用对象来接收参数(这种一般用在post创建的时候,使用@requestbody这样的场景,请求参数无法使用@apiimplicitparam注解进行描述的时候) @apimodelproperty:描述一个model的属性 @apiproperty:用对象接收参数时,描述对象的一个字段 @apiignore:使用该注解忽略这个api 。
基本上就是上面这些了,是不是很easy,下面看下效果图 。
2、使用springboot整合swagger2 。
上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springboot的方式,其实原理都是一样的.
1、maven依赖 。
1
2
3
4
5
6
7
8
9
10
11
|
<!--springfox依赖 -->
<dependency>
<groupid>io.springfox</groupid>
<artifactid>springfox-swagger2</artifactid>
<version>
2.7
.
0
</version>
</dependency>
<dependency>
<groupid>io.springfox</groupid>
<artifactid>springfox-swagger-ui</artifactid>
<version>
2.7
.
0
</version>
</dependency>
|
这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0 。
2、添加静态资源配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@configuration
public
class
webmvcconfig
extends
webmvcconfigureradapter {
/**
* 配置静态资源路径以及上传文件的路径
*
* @param registry
*/
@override
public
void
addresourcehandlers(resourcehandlerregistry registry) {
registry.addresourcehandler(
"/static/**"
).addresourcelocations(
"classpath:/static/"
);
registry.addresourcehandler(
"/upload/**"
).addresourcelocations(environment.getproperty(
"spring.resources.static-locations"
));
/*swagger-ui*/
registry.addresourcehandler(
"swagger-ui.html"
).addresourcelocations(
"classpath:/meta-inf/resources/"
);
registry.addresourcehandler(
"/webjars/**"
).addresourcelocations(
"classpath:/meta-inf/resources/webjars/"
);
}
}
|
其实就是最后两句,如果你不配置这个的话,访问swagger-ui.html会出现500,还是404的错误来着,记不清了,应该是404. 。
3、swagger2的配置类 。
和上面一样,基本上没区别 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@configuration
@enableswagger2
@enablewebmvc
public
class
swaggerconfig
extends
webmvcconfigurationsupport {
@bean
public
docket createrestapi() {
return
new
docket(documentationtype.swagger_2)
.apiinfo(apiinfo())
.select()
.apis(requesthandlerselectors.basepackage(
"net.laoyeye.yyblog.web.frontend"
))
.paths(pathselectors.none())
.build();
}
private
apiinfo apiinfo() {
return
new
apiinfobuilder()
.title(
"yyblog项目 restful apis"
)
.description(
"yyblog项目api接口文档"
)
.version(
"1.0"
)
.build();
}
}
|
注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#) 。
4、接口的配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/**
* 前台文章controller
* @author 小卖铺的老爷爷
* @date 2018年5月5日
* @website www.laoyeye.net
*/
@api
(description=
"文章查询"
)
@controller
@requestmapping
(
"/article"
)
public
class
articlecontroller {
@autowired
private
articleservice articleservice;
@autowired
private
settingservice settingservice;
@autowired
private
cateservice cateservice;
@autowired
private
tagreferservice tagreferservice;
@autowired
private
userservice userservice;
@autowired
private
articlemapper articlemapper;
@autowired
private
commentservice commentservice;
@apioperation
(value=
"文章查询接口"
)
@apiimplicitparam
(name =
"id"
, value =
"文章id"
, required =
true
, datatype =
"long"
)
@getmapping
(
"/{id}"
)
public
string index(model model,
@pathvariable
(
"id"
)
long
id) {
try
{
articleservice.updateviewsbyid(id);
}
catch
(exception ignore) {
}
list<setting> settings = settingservice.listall();
map<string,object> map =
new
hashmap<string,object>();
for
(setting setting : settings) {
map.put(setting.getcode(), setting.getvalue());
}
article article = articleservice.getarticlebyid(id);
model.addattribute(
"settings"
, map);
model.addattribute(
"catelist"
, cateservice.listallcate());
model.addattribute(
"article"
, article);
model.addattribute(
"tags"
, tagreferservice.listnamebyarticleid(article.getid()));
model.addattribute(
"author"
, userservice.getnicknamebyid(article.getauthorid()));
//回头改
model.addattribute(
"articles"
, articlemapper.listarticlebytitle(
null
));
model.addattribute(
"similars"
, articlemapper.listarticlebytitle(
null
));
commentquery query =
new
commentquery();
query.setlimit(
10
);
query.setpage(
1
);
query.setarticleid(id);
model.addattribute(
"comments"
, commentservice.listcommentbyarticleid(query));
return
"frontend/article"
;
}
@apioperation
(value=
"文章评论查询接口"
)
@postmapping
(
"/comments"
)
@responsebody
public
datagridresult comments(commentquery query) {
//设置默认10
query.setlimit(
10
);
return
commentservice.listcommentbyarticleid(query);
}
@apioperation
(value=
"文章点赞接口"
)
@apiimplicitparam
(name =
"articleid"
, value =
"文章id"
, required =
true
, datatype =
"long"
)
@postmapping
(
"/approve"
)
@responsebody
public
yyblogresult approve(
@requestparam
long
articleid) {
return
articleservice.updateapprovecntbyid(articleid);
}
}
|
最后同样来个效果图,和上面一样.
pathselectors.none()的时候 。
pathselectors.any()的时候 。
看到效果图是不是接口内容一目了然,很简洁明了了.
最后,好像忘记说swagger文档的路径了 。
如果你的项目在根目录:http://localhost:8080/swagger-ui.html 。
如果不是根目录那就是:http://localhost:8080/你的项目名/swagger-ui.html 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/laoyeye/p/9047504.html 。
最后此篇关于Java利用Swagger2自动生成对外接口的文档的文章就讲到这里了,如果你想了解更多关于Java利用Swagger2自动生成对外接口的文档的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 .sln 文件,里面有几个项目。为了简单起见,让我们称它们为... 项目A 项目B 项目C ...其中 A 是引用 B 和 C 的主要项目。我的目标是更新我的构建脚本,为 ProjectA
我安装了 Magento,我想知道如何生成完整的 API 文档,例如 http://docs.magentocommerce.com/ 上的文档是使用 phpdoc 生成的。 Magento 中是否包
我通常使用jetbrains family ide。在为函数创建文档时非常有用,只需输入 /** 如何在创建文档时创建自定义标签,例如@date标签。 最佳答案 JavaScript、Java: st
我正在尝试使用 jOpenDocument library创建文档。我已经执行了创建电子表格的示例 - 代码编译并运行正常,但当我尝试使用 Excel Office 2012 或 Google Doc
如标题。 有没有介绍HTML DOM构造的图片? 最佳答案 DOM(文档 对象模型)从文档 节点开始。它被称为“根节点”。 观察下面的树(括号中对应的nodeType): [HTMLDocument]
我喜欢 ColdFusion Builder。但我不喜欢帮助只有 CF9 文档。有什么方法可以将其更改为拥有 ColdFusion 8 文档? 最佳答案 http://livedocs.adobe.c
这个问题在这里已经有了答案: What is the consequence of this bit of javascript? (4 个答案) 关闭 9 年前。 我看到一些 jQuery 脚本嵌
我有一个 XML 文件,其中包含需要在 Word 文档中填充的数据。 我需要找到一种方法来定义一个模板,该模板可用作从 XML 文件填充数据并创建输出文档的基线。 我相信有两种方法可以做到这一点。 创
我正在尝试查找有关如何使用 AVAudioEngine 的详细文档。有谁知道我在哪里可以找到它? 我找到了这个,但与文档丰富的 UI 内容相比,它似乎非常简陋。 https://developer.a
我对 Tensorflow 文档越来越感到恼火和沮丧。我在谷歌上搜索了有关 的文档 tf.reshape 我被定向到一个通用页面,例如 here 。我想查看 tf.reshape 的详细信息,而不是整
我正在学习本教程:http://moxleystratton.com/clojure/clojure-tutorial-for-the-non-lisp-programmer 然后遇到了这个片段: u
如何在 swagger 中为对象数组编写文档。这是我的代码,但我不知道如何访问对象数组中的数据。 { "first_name":"Sam", "last_name":"Smith",
是否有针对 Javascript 的 JavaDocs 之类的东西?当我在 netbeans IDE 中按 ctrl+space 时 写javascript,指定对象的javascript文档就出来了
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我需要 JavaScript 中的 heredoc 之类的东西。你对此有什么想法吗?我需要跨浏览器功能。 我发现了这个: heredoc = '\ \ \ zzz\ \
WSDL 文档是包含一系列的,可描述某个 web service 的定义的,简单的 XML 文档 WSDL 文档结构 WSDL 文档用下表这些主要的元素来描述某个 web service 的
是否有 ocropus 的文档? 我正在寻找对以下功能的解释: make_SegmentPageByRAST(): segment() RegionExtractor(): setPageLines(
这个问题在这里已经有了答案: Understanding events and event handlers in C# (13 个回答) 4年前关闭。 我正在使用 NRECO 和 ffmpeg 对视
我正在尝试访问工作服务器以与名为 Spotfire 的应用程序一起使用。我的同事把这个传给我,现在已经休息了几个星期,我对他的建议有意见。 实际上,当我通过 localhost 运行我的 Web 应用
Elm 文档没有给出示例用法,因此很难理解类型规范的含义。在几个地方,我看到“a”用作参数标识符,例如 Platform.Cmd : map : (a -> msg) -> Cmd a -> Cmd
我是一名优秀的程序员,十分优秀!