接口文档:第二章:使用 Swagger 接口的文档在线自动生成
*/
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
/**
给字段添加注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
//根据参数和备注信息判断是否添加备注信息
if(addRemarkComments&&StringUtility.stringHasValue(remarks)){
// addFieldJavaDoc(field, remarks);
//数据库中特殊字符需要转义
if(remarks.contains(""")){
remarks = remarks.replace(""","'");
}
//给 model 的字段添加 swagger 注解
field.addJavaDocLine("@ApiModelProperty(value = ""+remarks+"")");
}
}
/**
给 model 的字段添加注释
*/
private void addFieldJavaDoc(Field field, String remarks) {
//文档注释开始
field.addJavaDocLine("/**");
//获取数据库字段的备注信息
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
for(String remarkLine:remarkLines){
field.addJavaDocLine(" * "+remarkLine);
}
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
super.addJavaFileComment(compilationUnit);
//只在 model 中添加 swagger 注解类的导入
if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){
compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
}
}
}
创建 Swagger2 配置类
在 Application.java 同级创建 Swagger2 的配置类 Swagger2
package com.swaggerTest;
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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
Swagger2 配置类
在与 spring boot 集成时,放在与 Application.java 同级的目录下。
通过 @Configuration 注解,让 Spring 来加载该类配置。
再通过 @EnableSwagger2 注解来启用 Swagger2。
*/
@Configuration
@EnableSwagger2
public class Swagger2 {
/**
创建 API 应用
apiInfo() 增加 API 相关信息
通过 select()函数返回一个 ApiSelectorBuilder 实例,用来控制哪些接口暴露给 Swagger 来展现,
本例采用指定扫描的包路径来定义指定要建立 API 的目录。
@return
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.sel
ect()
.apis(RequestHandlerSelectors.basePackage("com.swaggerTest.controller"))
.paths(PathSelectors.any())
.build();
}
/**
创建该 API 的基本信息(这些基本信息会展现在文档页面中)
访问地址:http://项目实际地址/swagger-ui.html
@return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot 中使用 Swagger2 构建 RESTful APIs")
.description("更多请关注http://www.baidu.com")
.termsOfServiceUrl("http://www.baidu.com")
.contact("sunf")
.version("1.0")
.build();
}
}
通过 createRestApi 函数创建 Docket 的 Bean 之后,**apiInfo()**用来创建该 Api 的基本信息(这些基本信息会展现在文档页面中)。
Swagger 使用的注解及其说明:
=====================
@Api:用在类上,说明该类的作用。
@ApiOperation:注解来给 API 增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。
@ApiImplicitParam:用来注解来给方法入参增加说明。
@ApiResponses:用于表示一组响应
@ApiResponse:用在 @ApiResponses 中,一般用于表达一个错误的响应信息
l?? code:数字,例如 400
l?? message:信息,例如"请求参数没填好"
l?? response:抛出异常的类???
@ApiModel:描述一个 Model 的信息(一般用在请求参数无法使用 @ApiImplicitParam 注解进行描述的时候)
l?? @ApiModelProperty:描述一个 model 的属性
注意:@ApiImplicitParam 的参数说明:
<table border="1" cellpadding="0" cellspacing="0"><tbody><tr><td><p><strong>paramType</strong>:指定参数放在哪个地方</p></td><td><p>header:请求参数放置于 Request Header,使用 @RequestHeader 获取</p><p>query:请求参数放置于请求地址,使用 @RequestParam 获取</p><p>path:(用于 restful 接口)-->请求参数的获取:@PathVariable</p><p>body:(不常用)</p><p>form(不常用)</p></td></tr><tr><td><p>name:参数名</p></td><td><p> </p></td></tr><tr><td><p>dataType:参数类型</p></td><td><p> </p></td></tr><tr><td><p>required:参数是否必须传</p></td><td><p>true | false</p></td></tr><tr><td><p>value:说明参数的意思</p></td><td><p> </p></td></tr><tr><td><p>defaultValue:参数的默认值</p></td><td><p> </p></td></tr></tbody></table>
案例 1:
package com.swaggerTest.controller;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
/**
一个用来测试 swagger 注解的控制器
注意 @ApiImplicitParam 的使用会影响程序运行,如果使用不当可能造成控制器收不到消息
@author SUNF
*/
@Controller
@RequestMapping("/say")
@Api(value = "SayController|一个用来测试 swagger 注解的控制器")
public class SayController {
@ResponseBody
@RequestMapping(value ="/getUserName", method= RequestMethod.GET)
@ApiOperation(value="根据用户编号获取用户姓名", notes="test: 仅 1 和 2 有正确返回")
@ApiImplicitParam(paramType="query", name = "userNumber", value = "用户编号", required = true, dataType = "Integer")
public String getUserName(@RequestParam Integer userNumber){
if(userNumber == 1){
return "张三丰";
}
else if(userNumber == 2){
return "慕容复";
}
else{
return "未知";
}
}
@ResponseBody
@RequestMapping("/updatePassword")
@ApiOperation(value="修改用户密码", notes="根据用户 id 修改密码")
@ApiImplicitParams({
@ApiImplicitParam(paramType="query", name = "userId", value = "用户 ID", required = true, dataType = "Integer"),
@ApiImplicitParam(paramType="query", name = "password", value = "旧密码", required = true, dataType = "String"),
@ApiImplicitParam(paramType="query", name = "newPassword", value = "新密码", required = true, dataType = "String")
})
public String updatePassword(@RequestParam(value="userId") Integer userId, @RequestParam(value="password") String password,
@RequestParam(value="newPassword") String newPassword){
if(userId <= 0 || userId > 2){
return "未知的用户";
}
if(StringUtils.isEmpty(password) || StringUtils.isEmpty(newPassword)){
评论