You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 7.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # spring-boot-demo-swagger
  2. > 此 demo 主要演示了 Spring Boot 如何集成原生 swagger ,自动生成 API 文档。
  3. >
  4. > 启动项目,访问地址:http://localhost:8080/demo/swagger-ui.html#/
  5. # pom.xml
  6. ```xml
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>spring-boot-demo-swagger</artifactId>
  12. <version>1.0.0-SNAPSHOT</version>
  13. <packaging>jar</packaging>
  14. <name>spring-boot-demo-swagger</name>
  15. <description>Demo project for Spring Boot</description>
  16. <parent>
  17. <groupId>com.xkcoding</groupId>
  18. <artifactId>spring-boot-demo</artifactId>
  19. <version>1.0.0-SNAPSHOT</version>
  20. </parent>
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. <swagger.version>2.9.2</swagger.version>
  26. </properties>
  27. <dependencies>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>io.springfox</groupId>
  39. <artifactId>springfox-swagger2</artifactId>
  40. <version>${swagger.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>io.springfox</groupId>
  44. <artifactId>springfox-swagger-ui</artifactId>
  45. <version>${swagger.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.projectlombok</groupId>
  49. <artifactId>lombok</artifactId>
  50. <optional>true</optional>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <finalName>spring-boot-demo-swagger</finalName>
  55. <plugins>
  56. <plugin>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-maven-plugin</artifactId>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </project>
  63. ```
  64. ## Swagger2Config.java
  65. ```java
  66. /**
  67. * <p>
  68. * Swagger2 配置
  69. * </p>
  70. *
  71. * @author yangkai.shen
  72. * @date Created in 2018-11-29 11:14
  73. */
  74. @Configuration
  75. @EnableSwagger2
  76. public class Swagger2Config {
  77. @Bean
  78. public Docket createRestApi() {
  79. return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
  80. .select()
  81. .apis(RequestHandlerSelectors.basePackage("com.xkcoding.swagger.controller"))
  82. .paths(PathSelectors.any())
  83. .build();
  84. }
  85. private ApiInfo apiInfo() {
  86. return new ApiInfoBuilder().title("spring-boot-demo")
  87. .description("这是一个简单的 Swagger API 演示")
  88. .contact(new Contact("Yangkai.Shen", "http://xkcoding.com", "237497819@qq.com"))
  89. .version("1.0.0-SNAPSHOT")
  90. .build();
  91. }
  92. }
  93. ```
  94. ## UserController.java
  95. > 主要演示API层的注解。
  96. ```java
  97. /**
  98. * <p>
  99. * User Controller
  100. * </p>
  101. *
  102. * @author yangkai.shen
  103. * @date Created in 2018-11-29 11:30
  104. */
  105. @RestController
  106. @RequestMapping("/user")
  107. @Api(tags = "1.0.0-SNAPSHOT", description = "用户管理", value = "用户管理")
  108. @Slf4j
  109. public class UserController {
  110. @GetMapping
  111. @ApiOperation(value = "条件查询(DONE)", notes = "备注")
  112. @ApiImplicitParams({@ApiImplicitParam(name = "username", value = "用户名", dataType = DataType.STRING, paramType = ParamType.QUERY, defaultValue = "xxx")})
  113. public ApiResponse<User> getByUserName(String username) {
  114. log.info("多个参数用 @ApiImplicitParams");
  115. return ApiResponse.<User>builder().code(200)
  116. .message("操作成功")
  117. .data(new User(1, username, "JAVA"))
  118. .build();
  119. }
  120. @GetMapping("/{id}")
  121. @ApiOperation(value = "主键查询(DONE)", notes = "备注")
  122. @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "用户编号", dataType = DataType.INT, paramType = ParamType.PATH)})
  123. public ApiResponse<User> get(@PathVariable Integer id) {
  124. log.info("单个参数用 @ApiImplicitParam");
  125. return ApiResponse.<User>builder().code(200)
  126. .message("操作成功")
  127. .data(new User(id, "u1", "p1"))
  128. .build();
  129. }
  130. @DeleteMapping("/{id}")
  131. @ApiOperation(value = "删除用户(DONE)", notes = "备注")
  132. @ApiImplicitParam(name = "id", value = "用户编号", dataType = DataType.INT, paramType = ParamType.PATH)
  133. public void delete(@PathVariable Integer id) {
  134. log.info("单个参数用 ApiImplicitParam");
  135. }
  136. @PostMapping
  137. @ApiOperation(value = "添加用户(DONE)")
  138. public User post(@RequestBody User user) {
  139. log.info("如果是 POST PUT 这种带 @RequestBody 的可以不用写 @ApiImplicitParam");
  140. return user;
  141. }
  142. @PostMapping("/multipar")
  143. @ApiOperation(value = "添加用户(DONE)")
  144. public List<User> multipar(@RequestBody List<User> user) {
  145. log.info("如果是 POST PUT 这种带 @RequestBody 的可以不用写 @ApiImplicitParam");
  146. return user;
  147. }
  148. @PostMapping("/array")
  149. @ApiOperation(value = "添加用户(DONE)")
  150. public User[] array(@RequestBody User[] user) {
  151. log.info("如果是 POST PUT 这种带 @RequestBody 的可以不用写 @ApiImplicitParam");
  152. return user;
  153. }
  154. @PutMapping("/{id}")
  155. @ApiOperation(value = "修改用户(DONE)")
  156. public void put(@PathVariable Long id, @RequestBody User user) {
  157. log.info("如果你不想写 @ApiImplicitParam 那么 swagger 也会使用默认的参数名作为描述信息 ");
  158. }
  159. @PostMapping("/{id}/file")
  160. @ApiOperation(value = "文件上传(DONE)")
  161. public String file(@PathVariable Long id, @RequestParam("file") MultipartFile file) {
  162. log.info(file.getContentType());
  163. log.info(file.getName());
  164. log.info(file.getOriginalFilename());
  165. return file.getOriginalFilename();
  166. }
  167. }
  168. ```
  169. ## ApiResponse.java
  170. > 主要演示了 实体类 的注解。
  171. ```java
  172. /**
  173. * <p>
  174. * 通用API接口返回
  175. * </p>
  176. *
  177. * @author yangkai.shen
  178. * @date Created in 2018-11-29 11:30
  179. */
  180. @Data
  181. @Builder
  182. @NoArgsConstructor
  183. @AllArgsConstructor
  184. @ApiModel(value = "通用PI接口返回", description = "Common Api Response")
  185. public class ApiResponse<T> implements Serializable {
  186. private static final long serialVersionUID = -8987146499044811408L;
  187. /**
  188. * 通用返回状态
  189. */
  190. @ApiModelProperty(value = "通用返回状态", required = true)
  191. private Integer code;
  192. /**
  193. * 通用返回信息
  194. */
  195. @ApiModelProperty(value = "通用返回信息", required = true)
  196. private String message;
  197. /**
  198. * 通用返回数据
  199. */
  200. @ApiModelProperty(value = "通用返回数据", required = true)
  201. private T data;
  202. }
  203. ```
  204. ## 参考
  205. 1. swagger 官方网站:https://swagger.io/
  206. 2. swagger 官方文档:https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Getting-started
  207. 3. swagger 常用注解:https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Annotations