参考:
knife4j官网:https://doc.xiaominfo.com/guide/useful.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80
swagger官网:https://github.com/swagger-api/swagger-core/wiki/Annotations-1.5.X#quick-annotation-overview
https://blog.csdn.net/github_38823514/article/details/88970607

swagger-bootstrap-ui默认访问地址是:http://${host}:${port}/doc.html

使用步骤

1.导依赖

  1. <dependency>
  2. <groupId>com.github.xiaoymin</groupId>
  3. <artifactId>knife4j-spring-boot-starter</artifactId>
  4. <version>2.0.3</version>
  5. </dependency>

2.配置

  1. @Configuration
  2. @EnableSwagger2
  3. @EnableKnife4j
  4. public class SwaggerConfig {
  5. /**
  6. * 创建API应用
  7. * apiInfo() 增加API相关信息
  8. * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
  9. * 本例采用指定扫描的包路径来定义指定要建立API的目录。
  10. */
  11. @Bean
  12. public Docket defaultApi2() {
  13. Docket docket = new Docket(DocumentationType.SWAGGER_2)
  14. .apiInfo(apiInfo())
  15. .select()
  16. .apis(RequestHandlerSelectors.basePackage("com.bestser.jewellery.inventory.controller"))
  17. .paths(PathSelectors.any())
  18. .build();
  19. return docket;
  20. }
  21. /**
  22. * 创建该API的基本信息(这些基本信息会展现在文档页面中)
  23. */
  24. private ApiInfo apiInfo() {
  25. return new ApiInfoBuilder()
  26. .title("进销存api文档")
  27. .description("进销存api文档,根据java代码自动生成")
  28. .version("v1.0")
  29. .build();
  30. }
  31. }

3.常用注解

@Api:用在类上,说明该类的作用。
@ApiOperation:注解来给API增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。
@ApiImplicitParam:用来注解来给方法入参增加说明。
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)

注意:@ApiImplicitParam的参数说明:
image.png


示例:

  1. /**
  2. * 一个用来测试swagger注解的控制器
  3. * 注意@ApiImplicitParam的使用会影响程序运行,如果使用不当可能造成控制器收不到消息
  4. *
  5. * @author SUNF
  6. */
  7. @Controller
  8. @RequestMapping("/say")
  9. @Api(value = "SayController|一个用来测试swagger注解的控制器")
  10. public class SayController {
  11. @ResponseBody
  12. @RequestMapping(value ="/getUserName", method= RequestMethod.GET)
  13. @ApiOperation(value="根据用户编号获取用户姓名", notes="test: 仅1和2有正确返回")
  14. @ApiImplicitParam(paramType="query", name = "userNumber", value = "用户编号", required = true, dataType = "Integer")
  15. public String getUserName(@RequestParam Integer userNumber){
  16. if(userNumber == 1){
  17. return "张三丰";
  18. }
  19. else if(userNumber == 2){
  20. return "慕容复";
  21. }
  22. else{
  23. return "未知";
  24. }
  25. }
  26. @ResponseBody
  27. @RequestMapping("/updatePassword")
  28. @ApiOperation(value="修改用户密码", notes="根据用户id修改密码")
  29. @ApiImplicitParams({
  30. @ApiImplicitParam(paramType="query", name = "userId", value = "用户ID", required = true, dataType = "Integer"),
  31. @ApiImplicitParam(paramType="query", name = "password", value = "旧密码", required = true, dataType = "String"),
  32. @ApiImplicitParam(paramType="query", name = "newPassword", value = "新密码", required = true, dataType = "String")
  33. })
  34. public String updatePassword(@RequestParam(value="userId") Integer userId, @RequestParam(value="password") String password,
  35. @RequestParam(value="newPassword") String newPassword){
  36. if(userId <= 0 || userId > 2){
  37. return "未知的用户";
  38. }
  39. if(StringUtils.isEmpty(password) || StringUtils.isEmpty(newPassword)){
  40. return "密码不能为空";
  41. }
  42. if(password.equals(newPassword)){
  43. return "新旧密码不能相同";
  44. }
  45. return "密码修改成功!";
  46. }
  47. }

示例;

  1. /**
  2. * @author hubert
  3. * @date 2020-06-02
  4. */
  5. @RestController
  6. @RequestMapping(value = "/product")
  7. @Api(tags = "货品")
  8. public class ProductController {
  9. private ProductService productService;
  10. public ProductController(ProductService productService) {
  11. this.productService = productService;
  12. }
  13. @ApiOperation(value = "获取产品分类详情")
  14. @GetMapping(value = "/category/{id}")
  15. public ProductCategoryDO getCategory(@PathVariable Integer id) {
  16. return productService.getProductCategoryById(id)
  17. .orElse(new ProductCategoryDO());
  18. }
  19. ...
  20. }

image.png