Swagger框架学习分享
一、背景介绍
1.1.项目简单介绍
Swagger项目是由Dilip Krishnan和Adrian Kelly等人维护开发的一个为Spring Web MVC 项目提供方法文档的一个框架。该框架最基本的功能是将Controller的方法进行可视化的展现,像方法凝视。方法參数,方法返回值等都提供了对应的用户界面。尤其是对JSON參数的支持。同一时候能够结合swagger-ui能够对用户界面进行不同程度的定制,也能够对方法进行一个简单的測试。
1.2.code repository
- github:https://github.com/springdox/springdox
- maven:http://www.mvnrepository.com/artifact/com.mangofactory/swagger-springmvc
1.3.演示项目
二、开发准备
2.1.环境准备
- idea intellij 13+
- Oracle java 1.6
- Gradle 2.0 +
2.2.项目搭建
2.2.1.jar仓库
Maven
<repositories> <repository> <id>jcenter-release</id> <name>jcenter</name> <url>http://oss.jfrog.org/artifactory/oss-release-local/</url> </repository></repositories><dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>1.0.0</version></dependency> |
Gradle
repositories jcenter()}compile "com.mangofactory:swagger-springmvc:1.0.0" |
2.2.2.相关依赖
- As of v0.9.5 all dependencies on scala have been removed.
- Spring 3.2.x or above
- jackson 2.4.4
- guava 15.0
2.2.3.编写配置文件
编写一个Java文件,并使用注解:
- @Configuration 配置注解,自己主动在本类上下文载入一些环境变量信息
- @EnableWebMvc
- @EnableSwagger 使swagger生效
- @ComponentScan("com.myapp.packages") 须要扫描的包路径
演示样例:
package org.bugkillers.back.swagger; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.models.dto.ApiInfo;
import com.mangofactory.swagger.paths.SwaggerPathProvider;
import com.mangofactory.swagger.plugin.EnableSwagger;
import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;
/**
* 使用注解的方式来扫描API
* 无需在Spring的xml配置文件来配置。由 @see @EnableWebMvc 取代
* <p/>
* <p> @author 刘新宇
*
* <p> @date 2015年1月30日 下午1:18:48
* <p> @version 0.0.1
*/
@Configuration
@EnableWebMvc
@EnableSwagger
@ComponentScan(basePackages ={"com.ak.swaggerspringmvc.shared.controller", "com.ak.spring3.music"})
public class CustomJavaPluginConfig extends WebMvcConfigurerAdapter {
private SpringSwaggerConfig springSwaggerConfig;
@Autowired
public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
this.springSwaggerConfig = springSwaggerConfig;
}
/**
* 链式编程 来定制API样式
* 兴许会加上分组信息
* @return
*/
@Bean
public SwaggerSpringMvcPlugin customImplementation(){
return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
.apiInfo(apiInfo())
.includePatterns(".*")
// .pathProvider(new GtPaths())
.apiVersion("0.0.1")
.swaggerGroup("user");
}
private ApiInfo apiInfo() {
ApiInfo apiInfo = new ApiInfo(
"bugkillers-back API",
"bugkillers 后台API文档",
"<a href="http://127.0.0.1:9081/api" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important; background: none !important;">http://127.0.0.1:9081/api",
"bugkillers@163.com",
"My License",
"My Apps API License URL"
);
return apiInfo;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
} class GtPaths extends SwaggerPathProvider{
@Override
protected String applicationPath() {
return "/restapi";
}
@Override
protected String getDocumentationPath() {
return "/restapi";
}
} }
也能够自己不写配置类,直接使用默认的实现类,在Spring的配置文件里共配置:(不推荐)
|
1
2
|
<mvc:annotation-driven/><bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" /> |
2.2.4.与swagger-ui集成
方式一:
- Note: Only use this option if you don't need to customize any of the swagger-ui static content, otherwise use option 2.
- Use the web-jar which packages all of the swagger-ui static content.
- Requires that your app is using the servlet 3 specification.
- For non-spring boot applications some extra spring configuration (ResourceHandler's) is required. See: https://github.com/adrianbk/swagger-springmvc-demo/tree/master/swagger-ui
|
1
2
3
4
|
dependencies ... compile "org.ajar:swagger-spring-mvc-ui:0.4"} |
- Manually copy all of the static content swagger-ui's dist directory (https://github.com/wordnik/swagger-ui/tree/master/dist)
- Provide the necessary view resolvers and resource handlers to serve the static content.
- Consult the spring documentation on serving static resources.
The following is one way to serve static content from /src/main/webapp
|
1
2
3
4
5
|
<!--static mappings<mvc:resources"*.html" location="/"/><!--static content--><mvc:default-servlet-handler/> |
2.6.5.Controller配置
使用注解对Controller进行配置:
- @Api 配置方法API
- @ApiOperation API的操作 GET PUT DELETE POST
- @ApiParam API的方法參数描写叙述
演示样例Controller:
package org.bugkillers.back.user.controller;
import java.util.List;
import org.bugkillers.back.bean.User;
import org.bugkillers.back.result.Result;
import org.bugkillers.back.user.service.UserService;
import org.bugkillers.back.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
/**
* 用户操作Controller
* <p/>
* <p>
*
* @author 刘新宇
*
* <p>
* @date 2015年1月30日 上午10:50:34
* <p>
* @version 0.0.1
*/
@Api(value = "user-api", description = "有关于用户的CURD操作", position = 5)
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService service;
/**
* 注冊用户
* @param user
*/
@ApiOperation(value = "注冊", notes = "注冊用户", position = 3)
@ResponseBody
@RequestMapping(value = { "/regist" }, method = RequestMethod.POST)
public ResponseEntity<? > regist(@RequestBody User user) {
service.save(user);
Result<String> result = ResultUtil.buildSuccessResult("注冊成功");
return new ResponseEntity<Result<String>>(result, HttpStatus.OK);
} /**
* 依据pk查找用户
* @param userPk
* @return
*/
@ApiOperation(value = "依据pk查找用户", notes = "返回用户实体对象", response = User.class, position = 2)
@ResponseBody
@RequestMapping(value = { "/{userPk}" }, method = RequestMethod.GET)
public ResponseEntity<?> findByPk(
@ApiParam(value = "填写Pk", allowableValues = "range[1,5]", required = true, defaultValue = "userPk", allowMultiple = true) @PathVariable("userPk") Integer userPk) {
Result<User> result = ResultUtil.buildSuccessResult(service.findByPk(userPk));
return new ResponseEntity<Result<User>>(result, HttpStatus.OK);
} /**
* 測试
* @param who
* @return
*/
@ApiOperation(value = "Hellow World", notes = "測试功能", position = 1)
@ResponseBody
@RequestMapping(value = { "/hello/{who}" }, method = RequestMethod.GET)
public ResponseEntity<? > hello(
@ApiParam(value = "填写名称") @PathVariable("who") String who) {
Result<String> result = ResultUtil.buildSuccessResult( "Hello guys" + " " + who + "!");
return new ResponseEntity<Result<String>>(result, HttpStatus.OK);
}
/**
* 查询全部
* @return
*/
@ApiOperation(value = "获取全部用户", notes = "返回用户实体对象集合", position = 5)
@RequestMapping(value = "/findAll", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<?> findAll() {
Result<List<User>> result = ResultUtil.buildSuccessResult( service.findAll());
return new ResponseEntity<Result<List<User>>>(result, HttpStatus.OK);
} /**
* 依据用户pk更新实体
* @param userPk 用户pk
* @param user 返回更新后的实体
* @return
*/
@ApiOperation(value = "更新用户", notes = "返回更新的用户实体对象",position = 5)
@RequestMapping(value = "/update/{userPk}", method = RequestMethod.PUT)
public ResponseEntity<?> updateByPk(
@PathVariable("userPk") Integer userPk, @RequestBody User user) {
user.setPk_user(userPk);
service.update(user);
Result<User> result = ResultUtil.buildSuccessResult(user);
return new ResponseEntity<Result<User>>(result, HttpStatus.OK);
} /**
* 依据用户pk删除实体
* @param userPk 用户pk
* @return
*/
@ApiOperation(value = "删除用户", notes = "依据pk删除用户",position = 5)
@RequestMapping(value = "/delete/{userPk}", method = RequestMethod.GET)
public ResponseEntity<?> deleteByPk(
@PathVariable("userPk") Integer userPk) {
service.delete(userPk);
Result<String> result = ResultUtil.buildSuccessResult("删除成功");
return new ResponseEntity<Result<String>>(result, HttpStatus.OK);
}
}
2.2.6.启动中间件
项目配置了Jetty或者Tomcat等Web容器的话,在相应的Controller配置好的话就能够启动看效果了。
- 远程演示样例:http://115.29.170.213/api
2.2.7.需求定制
- 分组信息定制
- Url定制
- Http对应定制
三、学习感想
Swagger非常好的为我们在开发RESTful框架应用时,前后台分离的情况下提供了非常有效的解决方式。上手迅速,操作简单,界面精简,功能完好。满足各种定制化的需求,是在使用Spring MVC做Web开发时的不二选择。
通过对swagger的学习。增强了英语交流的能力。改变了曾经的学习方法。收获了非常多,同一时候也也得感谢国外友人的悉心帮助~技术无国界~
3.1 Guava工具类的使用 http://ifeve.com/google-guava/
Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等
3.2 Gradle构建工具的使用 http://ifeve.com/google-guava/
配置更加简洁。支持Maven,好多开源项目已经从Maven转到Gradle。
3.3 Groovy语言 http://groovy.codehaus.org/User+Guide
和scala、clojure等同是在JVM上执行的脚本语言,丰富的类库。和Java互通。能够作为Java程序猿的第二语言。
3.4 链式编程 (return this)
Java中类似Swagger配置文件SwaggerSpringMvcPlugin
JQuery中类似 $("#p1").css("color","red").slideUp(2000).slideDown(2000);
在公司的Wiki上写的博文。由于外面訪问不了公司的内网,故贴过来给须要的小伙伴们分享一下,有疑问的能够随时交流。
Swagger框架学习分享的更多相关文章
- Swagger+Spring MVC框架学习分享
[html] view plain copy 最近参与公司接口编写,Android和IOS端都要调用这些接口,需要对接调试,如果没有一个接口文档,管理接口,别人用了接口,也不知道接口怎么用,接口上有什 ...
- 【框架学习与探究之定时器--Hangfire】
声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
- Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...
- Java基础及JavaWEB以及SSM框架学习笔记Xmind版
Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...
- kratos微服务框架学习笔记一(kratos-demo)
目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...
- ElasticSearch 5学习(7)——分布式集群学习分享2
前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...
- ElasticSearch 5学习(6)——分布式集群学习分享1
在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
随机推荐
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下: jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码 ...
- android 可拖动控件 ontouchevent
首先附上文章的转载内容的链接: 学习android 可拖动事件首先需要对android的屏幕和touchevent参数建立一个详细的知识结构. 1.android坐标系统 一.首先明确一下 andro ...
- 多文件上传ajax jquery
jquery的ajaxSubmit()和多文件上传 <%@ page language="java" import="java.util.*" pageE ...
- elasticsearch5.3.0 bulk index 性能调优实践
elasticsearch5.3.0 bulk index 性能调优实践 通俗易懂
- 5.13会话技术Cookie---Session
.会话技术: 1.会话:一次会话中包含多次请求和相应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2.功能:在一次会话的范围内的多次请求间,共享数据 3.方式: 1.客 ...
- web通信之跨文档通信 postMessage
index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...
- 八进制、十进制、操作符(day04)
把二进制表示的数字从右向左每三个数位分成 一组,每组用一个0到7之间的数字替换. 这个替换结果叫做数字的八进制表示方式 (八进制) 可以直接在程序里用八进制方式表示数字, 这种数字必须以0做开头 可以 ...
- Linux思维导图之用户、组和权限
安全3A: Authenticanion认证:验证用户身份; 授权授权;依据身份进行不同权利的分配.Acouting | 劲舞团审计:监督工作. user:id -u 令牌:(护符)ID号 .Linu ...
- python项目开发:学员管理系统
学员管理系统 #需求: 1.用户角色:讲师/学员,登陆后根据角色不同能做的事情不同 2.讲师视图 - 管理班级,可创建班级,根据学员qq号把学员加入班级 - 可创建指定班级的上课纪录,注意一节上课纪录 ...
- vue中的slot理解和使用
最近被vue 搞得一塌糊涂,理解的比较慢,工作进度进度要求太快,需求理解不明,造成了很大的压力. 在理解Vue中的Slot的时候看了网上的相关内容,看了半天没看到明白说的是什么,然后自己就安装了vue ...