一、导入依赖

由于原生的 Swagger 界面实在太丑,所以直接使用[knife4j](https://xiaoym.gitee.io/knife4j/),其官网为:https://xiaoym.gitee.io/knife4j/documentation/get_start.html

注入依赖:

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

二、配置 Swagger

  1. @Configuration
  2. @EnableSwagger2WebMvc
  3. public class Knife4jConfiguration {
  4. @Bean(value = "defaultApi2")
  5. public Docket defaultApi2() {
  6. Docket docket=new Docket(DocumentationType.SWAGGER_2)
  7. .apiInfo(new ApiInfoBuilder()
  8. //.title("swagger-bootstrap-ui-demo RESTful APIs")
  9. .description("# swagger-bootstrap-ui-demo RESTful APIs")
  10. .termsOfServiceUrl("http://www.xx.com/")
  11. .contact("xx@qq.com")
  12. .version("1.0")
  13. .build())
  14. //分组名称
  15. .groupName("2.X版本")
  16. .select()
  17. //这里指定Controller扫描包路径
  18. .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
  19. .paths(PathSelectors.any())
  20. .build();
  21. return docket;
  22. }
  23. }

三、高版本依赖报错

导入依赖运行项目出现下面错误信息:

  1. Failed to start bean 'documentationPluginsBootstrapper';
  2. nested exception is java.lang.NullPointerException

这是因为Spring Boot2.6.0+以上的版本是默认禁止 Bean 的循环引用。

  • 解决办法1:就是降低SpringBoot的版本;
  • 解决办法2:添加如下配置:
    1. spring:
    2. mvc:
    3. pathmatch:
    4. matching-strategy: ANT_PATH_MATCHER

四、JWT配置

  1. import io.swagger.annotations.ApiOperation;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import springfox.documentation.builders.ApiInfoBuilder;
  5. import springfox.documentation.builders.PathSelectors;
  6. import springfox.documentation.builders.RequestHandlerSelectors;
  7. import springfox.documentation.service.*;
  8. import springfox.documentation.spi.DocumentationType;
  9. import springfox.documentation.spi.service.contexts.SecurityContext;
  10. import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
  11. import springfox.documentation.spring.web.plugins.Docket;
  12. import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. @Configuration // 声明配置类
  16. @EnableSwagger2WebMvc
  17. public class SwaggerConfig2 {
  18. @Bean
  19. public Docket create() {
  20. Docket docket = new Docket(DocumentationType.SWAGGER_2);
  21. /** 1.设置Swagger的基本信息 */
  22. // ApiInfoBuilder 用于在Swagger界面上添加各种信息
  23. ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
  24. // 添加标题
  25. apiInfoBuilder.title("EMOS在线办公系统");
  26. // 将基本信息封装到 ApiInfo 类中并添加到 docket
  27. ApiInfo apiInfo = apiInfoBuilder.build();
  28. docket.apiInfo(apiInfo);
  29. /** 2.设置哪些类的哪些方法添加到Swagger中 */
  30. // ApiSelectorBuilder 用来设置哪些类中的方法会生成到REST API中
  31. ApiSelectorBuilder apiSelectorBuilder = docket.select();
  32. // 设置所有的类都可以被添加到swagger中
  33. apiSelectorBuilder.paths(PathSelectors.any()); // PathSelectors.any() 表示包下的所有类
  34. // 设置只有方法上包含ApiOperation注解的方法才能被添加到Swagger中
  35. // 使用@ApiOperation的方法会被提取到REST API中
  36. apiSelectorBuilder.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class));
  37. docket = apiSelectorBuilder.build();
  38. /** 3.设置JWT单点登录功能
  39. * 下面的语句是开启对JWT的支持,当用户用Swagger调用受JWT认证保护的方法时,
  40. * 必须要先提交参数(例如令牌)
  41. * */
  42. // 规定在header(3)中接收令牌,请求头中的参数为token(1),描述信息为token(2)
  43. // 存储用户必须提交的参数
  44. ApiKey apiKey = new ApiKey("token", "token", "header");
  45. List<SecurityScheme> securitySchemeList = new ArrayList<>();
  46. // 规定用户需要输入什么参数
  47. securitySchemeList.add(apiKey);
  48. // swagger就知道了在请求头里面的token参数提交的令牌字符串
  49. docket.securitySchemes(securitySchemeList);
  50. // 如果Swagger判断的令牌有效,则设置令牌的作用域
  51. // 这里设置作用域为全局
  52. // 如果用户JWT认证通过,则在Swagger中全局有效
  53. AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
  54. AuthorizationScope[] scopes = {authorizationScope};
  55. // 存储令牌和作用域
  56. SecurityReference reference = new SecurityReference("token", scopes);
  57. List<SecurityReference> referenceList = new ArrayList<>();
  58. referenceList.add(reference);
  59. SecurityContext context = SecurityContext.builder().securityReferences(referenceList).build();
  60. List<SecurityContext> contextList = new ArrayList<>();
  61. contextList.add(context);
  62. docket.securityContexts(contextList);
  63. return docket;
  64. }
  65. }