[TOC]html
为了完成项目自带文档的需求,花了必定的时间研究Spring Boot
集成Swagger
。看了官方文档和一些博客,差很少搭出一个比较通用的架子。文末会分享出案例项目。java
本文使用Spring Boot
+Spring Fox
的方式集成Swagger
框架。
<properties> <swagger.version>2.7.0</swagger.version> </properties> <dependencies> <!-- swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <!-- swagger2 ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> </dependencies>
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.switchvov.swagger")) .paths(PathSelectors.any()) .build() .securitySchemes(securitySchemes()) .securityContexts(securityContexts()); } /** * 配置认证模式 */ private List<ApiKey> securitySchemes() { return newArrayList(new ApiKey("Authorization", "Authorization", "header")); } /** * 配置认证上下文 */ private List<SecurityContext> securityContexts() { return newArrayList(SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build()); } private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return newArrayList(new SecurityReference("Authorization", authorizationScopes)); } /** * 项目信息 */ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Swagger测试项目 RESTful APIs") .version("1.0") .build(); } }
Swagger官方Wiki 注解
swagger2经常使用注解说明
swagger注释API详细说明PS:以上几篇文章已经将
Swagger
注解的使用方式及做用阐述的很是清楚了。这里只给出代码案例。gitPS:
springfox-swagger2:2.7.0
已经支持泛型返回对象。
<font color='red'>注意:千万不要在@ApiOperation
注解里限定response()
,让框架推断类型就好了。</font>github
@RestController @RequestMapping(value = "/user", produces = "application/json") @Api(value = "User", tags = {"User"}, description = "用户相关") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") @ApiOperation(value = "使用ID查询用户") @ApiImplicitParams({ @ApiImplicitParam(value = "ID", name = "id", dataType = "int", paramType = "path", required = true, defaultValue = "1") }) @ApiResponses({ @ApiResponse(code = 400, message = "请求参数有误"), @ApiResponse(code = 401, message = "未受权"), @ApiResponse(code = 403, message = "禁止访问"), @ApiResponse(code = 404, message = "请求路径不存在"), @ApiResponse(code = 500, message = "服务器内部错误") }) public ResponseResult<User> getById(@PathVariable("id") Integer id) { User user = userService.getById(id); return ResponseResult.successWithData(user); } @PostMapping("") @ApiOperation(value = "建立用户") @ApiResponses({ @ApiResponse(code = 400, message = "请求参数有误"), @ApiResponse(code = 401, message = "未受权"), @ApiResponse(code = 403, message = "禁止访问"), @ApiResponse(code = 404, message = "请求路径不存在"), @ApiResponse(code = 500, message = "服务器内部错误") }) public ResponseResult<User> createUser(@Validated @RequestBody User user) { User dbUser = userService.createUser(user); return ResponseResult.successWithData(dbUser); } }
@ApiModel(description = "响应对象") public class ResponseResult<T> { private static final int SUCCESS_CODE = 0; private static final String SUCCESS_MESSAGE = "成功"; @ApiModelProperty(value = "响应码", name = "code", required = true, example = "" + SUCCESS_CODE) private int code; @ApiModelProperty(value = "响应消息", name = "msg", required = true, example = SUCCESS_MESSAGE) private String msg; @ApiModelProperty(value = "响应数据", name = "data") private T data; // 省略get、set方法等等,详见源代码 }
PS:用户model使用了lombok
、jpa
、validator
,只须要关注@Api
开头的注解就好了。
@Data @Entity(name = "users") @ApiModel(description = "用户Model") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Null(message = "id必须为空") @ApiModelProperty(value = "用户ID", name = "id") private Integer id; @Column @NotBlank(message = "用户名不能为空") @ApiModelProperty(value = "用户名", name = "username", required = true, example = "zhaoliu") private String username; @Column @NotBlank(message = "密码不能为空") @ApiModelProperty(value = "密码", name = "password", required = true, example = "123456") private String password; }
GitHub:swagger-demospring
分享并记录所学所见