使用Swagger在SpringBoot项目中管理API文档(使用Oauth2)

原创 2016年08月04日 14:23:10
1 、修改pom.xml引入swagger
      <!-- Swagger begin -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.5.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.5.0</version>
        </dependency>
        <!-- Swagger end -->

2、SwaggerConfig.java
import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.builders.PathSelectors.ant;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.documentation.builders.OAuthBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationCodeGrant;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.GrantType;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.service.TokenEndpoint;
import springfox.documentation.service.TokenRequestEndpoint;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.ApiKeyVehicle;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * SwaggerConfig
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value("${security.userOauth.clientId}")
private String authClientId;

@Value("${security.userOauth.clientSecret}")
private String authClientSecret;

@Value("${security.userOauth.type}")
private String type;

@Value("${security.userOauth.authorizationUrl}")
private String authorizationUrl;

@Value("${security.userOauth.tokenUrl}")
private String tokenUrl;

@Value("${security.userOauth.tokenName}")
private String tokenName;

@Value("${security.userOauth.scope.code}")
private String scopeCode;

@Value("${security.userOauth.scope.desc}")
private String scopeDesc;

@Value("${app.key}")
private String appKey;

@Value("${app.name}")
private String appName;

@Value("${app.desc}")
private String appDesc;

@Value("${app.version}")
private String appVersion;

@Value("${app.termsOfServiceUrl}")
private String termsOfServiceUrl;

@Value("${app.contact.name}")
private String contactName;

@Value("${app.contact.url}")
private String contactUrl;

@Value("${app.contact.email}")
private String contactEmail;

@Value("${app.license}")
private String license;

@Value("${app.licenseUrl}")
private String licenseUrl;

/**
* Api分组,可以定义多个组
*/
@Bean
public Docket jackApi() {
return new Docket(DocumentationType.SWAGGER_2).groupName("jack")
.genericModelSubstitutes(DeferredResult.class)
.useDefaultResponseMessages(false)
.forCodeGeneration(true)
.pathMapping("/")
.select()
.apis(RequestHandlerSelectors.basePackage("net.jack.lt"))
.build()
.securitySchemes(newArrayList(oauth()))
.securityContexts(newArrayList(securityContext()))
.apiInfo(jyxApiInfo());
}

private ApiInfo jyxApiInfo() {
ApiInfo apiInfo = new ApiInfo(appName, appDesc, appVersion, termsOfServiceUrl, 
new Contact(contactName, contactUrl, contactEmail),
license, licenseUrl);


return apiInfo;
}

@Bean
SecurityScheme apiKey() {
       return new ApiKey(appName, appKey, "header");
}


@Bean
SecurityContext securityContext() {
AuthorizationScope[] scopes = new AuthorizationScope[]{new AuthorizationScope(scopeCode, scopeDesc)};

SecurityReference securityReference = SecurityReference
.builder()
.reference(type)
.scopes(scopes)
.build();


return SecurityContext
.builder()
.securityReferences(newArrayList(securityReference))
.forPaths(ant("/api/**"))
.build();
}

@Bean
SecurityScheme oauth() {
return new OAuthBuilder()
.name(type)
.grantTypes(grantTypes())
.scopes(scopes())
.build();
}

List<AuthorizationScope> scopes() {
return newArrayList(new AuthorizationScope(scopeCode, scopeDesc));
}

List<GrantType> grantTypes() {
List<GrantType> grants = newArrayList(new AuthorizationCodeGrant(
new TokenRequestEndpoint(authorizationUrl, authClientId, authClientSecret),
new TokenEndpoint(tokenUrl, tokenName)));
return grants;
}

@Bean
public SecurityConfiguration securityInfo() {
return new SecurityConfiguration(authClientId, authClientSecret, scopeCode, 
appKey, appKey, ApiKeyVehicle.HEADER, "", ",");
}
}

3、在RESTful接口上添加注解@ApiOperation @ApiParam
     /**
 * 药品产品列表获取接口
 * pageNo 第几页
 * rows 每页条数
 * @return
 */
@RequestMapping(value = "/products", method = RequestMethod.GET)
@ApiOperation(value = "药品产品列表获取接口", notes = "可指定页码及每页条数")
@ResponseBody
public DrugProducts getDrugProductList(
@ApiParam(value="第几页") @RequestParam(required=false) Integer pageNo, 
@ApiParam(value="每页条数") @RequestParam(required=false) Integer rows) {
     }
或者
     @RequestMapping(value = "/hello", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value="问好", notes="向你问好")
@ApiImplicitParams({
        @ApiImplicitParam(name = "page", value = "第几页", required = false,
                dataType = "int", paramType = "query", defaultValue = "0"),
        @ApiImplicitParam(name = "count", value = "每页行数", required = false,
                dataType = "int", paramType = "query", defaultValue = "30"),
        @ApiImplicitParam(name = "name", value = "姓名", required = false,
                dataType = "string", paramType = "query", defaultValue = "")
})

public CommonParam hello(HttpServletRequest request) {

CommonParam commonParam = new CommonParam();
commonParam.setId(1);
commonParam.setName(request.getParameter("name"));
return commonParam;
}

4、在application.properties或application.yml中增加配置项
security.userOauth.clientId=swagger-ui
security.userOauth.clientSecret=Sa0rk3kgx
security.userOauth.type=oauth2
security.userOauth.authorizationUrl=http://dev.jyx365.top/sso/login
security.userOauth.tokenUrl=http://dev.jyx365.top/oauth/access_token
security.userOauth.tokenName=access_token
security.userOauth.scope.code=userinfo
security.userOauth.scope.desc=用户信息
app.key=learning
app.name=每日一学
app.desc=每日一学RESTful
app.version=0.1
app.termsOfServiceUrl=http://blog.csdn.net/jacktonny1
app.contact.name=闫不由衷
app.contact.url=http://blog.csdn.net/jacktonny1
app.contact.email=hulala208@126.com
app.license=The Apache License, Version 2.0
app.licenseUrl=http://www.apache.org/licenses/LICENSE-2.0.html

或 application.yml
security:
  userOauth:
    clientId: swagger-ui
    clientSecret: Sa0rk3kgx
    type: oauth2
    authorizationUrl: http://dev.jyx365.top/sso/login
    tokenUrl: http://dev.jyx365.top/oauth/access_token
    tokenName: access_token
    scope:
      code: userinfo
      desc: 用户信息
app:
  key: learning
  name: 每日一学
  desc: 每日一学RESTful
  version: 0.1
  termsOfServiceUrl: http://blog.csdn.net/jacktonny1
  contact:
    name: 闫不由衷
    url: http://blog.csdn.net/jacktonny1
    email: hulala208@126.com
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.html


5、http://localhost:端口号/swagger-ui.html


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

springboot【3】web开发之构建RESTful API与单元测试

使用Spring MVC来实现一组对User对象操作的RESTful API, 配合注释详细说明在Spring MVC中映射HTTP请求、传参、编写单元测试。 我们通过引入web模块,但是没有做其...
  • IT_lyd
  • IT_lyd
  • 2017-07-28 15:17
  • 1246

Log4j打开debug功能

今天在fix一个bug的时候发现Log4j加载了多个配置文件导致系统日志出现问题,后来发现可以通过打开log4j的debug功能来检查,具体做法就是在启动JVM的时候加一个参数,如下:JAVA_OPT...
  • kongxx
  • kongxx
  • 2010-09-30 13:13
  • 6185

springboot【4】web开发之使用模板引擎渲染web视图

1.静态资源访问 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: ...

文件服务OOM问题定位

最近在开发一个文件管理服务,实际文件存储在阿里的OSS上,服务本身只管理文件映射,需要调用阿里的API生成授权访问链接。 今天做了一下压力测试: 1)在服务端先开启visualvm(jdk1.7以上自...

图形数据库、NOSQL和Neo4j

原文链接 http://www.infoq.com/cn/articles/graph-nosql-neo4j 图形数据库、NOSQL和Neo4j 简介 在众多不同的数据...

poi导出excel 之工具类(一)

实现poi导出excel表格,最方便的就是封装工具类,以便公用,下面直接贴代码,亲测可用。需求差异请适当修改源码! 工具类源码见文尾。。。。。。 代码测试 一、前端请求: ...
  • IT_lyd
  • IT_lyd
  • 2017-07-19 16:02
  • 3992

log4j 详细讲解(不能再详细了)

日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j 可以免费下载到Log...

Spring Boot项目结构推荐

Spring Boot框架本身并没有对项目结构有特别的要求,但是按照最佳实践的项目结构可以减少可能会遇见的坑,尤其是Spring包扫描机制的存在,也可以免去不少特殊的配置工作。 典型示例一 root...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)