SwaggerConfig.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package com.poyee.config;
  2. import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
  3. import com.google.common.base.Function;
  4. import com.google.common.base.Optional;
  5. import com.google.common.base.Predicate;
  6. import io.swagger.annotations.ApiOperation;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.annotation.Import;
  11. import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
  12. import springfox.documentation.RequestHandler;
  13. import springfox.documentation.builders.ApiInfoBuilder;
  14. import springfox.documentation.builders.PathSelectors;
  15. import springfox.documentation.builders.RequestHandlerSelectors;
  16. import springfox.documentation.service.ApiInfo;
  17. import springfox.documentation.service.Contact;
  18. import springfox.documentation.spi.DocumentationType;
  19. import springfox.documentation.spring.web.plugins.Docket;
  20. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  21. /**
  22. * Knife4j 接口文档配置
  23. */
  24. @Configuration
  25. @EnableSwagger2
  26. @EnableKnife4j
  27. @Import(BeanValidatorPluginsConfiguration.class)
  28. public class SwaggerConfig {
  29. private static String splitor = ";";
  30. /** 是否开启swagger */
  31. @Value("${swagger.enabled:false}")
  32. private boolean enabled;
  33. /**
  34. * 创建API
  35. */
  36. @Bean
  37. public Docket createRestApi() {
  38. return new Docket(DocumentationType.SWAGGER_2)
  39. // 是否启用Swagger
  40. .enable(enabled)
  41. // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
  42. .apiInfo(apiInfo())
  43. // 设置哪些接口暴露给Swagger展示
  44. .select()
  45. // 扫描所有有注解的api,用这种方式更灵活
  46. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  47. // 扫描指定包中的swagger注解
  48. .apis(RequestHandlerSelectors.basePackage("com.poyee"))
  49. // 扫描所有
  50. .apis(RequestHandlerSelectors.any())
  51. .paths(PathSelectors.any())
  52. .build();
  53. }
  54. /**
  55. * 添加摘要信息
  56. */
  57. private ApiInfo apiInfo() {
  58. // 用ApiInfoBuilder进行定制
  59. return new ApiInfoBuilder()
  60. // 设置标题
  61. .title("订单服务接口文档")
  62. // 描述
  63. .description("订单服务 API 接口文档")
  64. // 作者信息
  65. .contact(new Contact("poyee", null, null))
  66. // 版本
  67. .version("1.0")
  68. .build();
  69. }
  70. /**
  71. * 创建Partner API(分组示例)
  72. */
  73. @Bean
  74. public Docket createPartnerRestApi() {
  75. return new Docket(DocumentationType.SWAGGER_2)
  76. .groupName("1.0")
  77. // 是否启用Swagger
  78. .enable(enabled)
  79. // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
  80. .apiInfo(partnerApiInfo())
  81. // 设置哪些接口暴露给Swagger展示
  82. .select()
  83. // 扫描所有有注解的api,用这种方式更灵活
  84. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  85. // 扫描指定包中的swagger注解
  86. .apis(basePackage("com.poyee.controller"))
  87. // 扫描所有
  88. .apis(RequestHandlerSelectors.any())
  89. .paths(PathSelectors.any())
  90. .build();
  91. }
  92. /**
  93. * 添加摘要信息
  94. */
  95. private ApiInfo partnerApiInfo() {
  96. // 用ApiInfoBuilder进行定制
  97. return new ApiInfoBuilder()
  98. // 设置标题
  99. .title("订单服务接口文档")
  100. // 描述
  101. .description("订单服务 Partner API 接口文档")
  102. // 作者信息
  103. .contact(new Contact("poyee", null, null))
  104. // 版本
  105. .version("partner")
  106. .build();
  107. }
  108. public static Predicate<RequestHandler> basePackage(final String basePackage) {
  109. return input -> declaringClass(input).transform(handlerPackage(basePackage))
  110. .or(true);
  111. }
  112. private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
  113. return input -> {
  114. // 循环判断匹配
  115. for (String strPackage : basePackage.split(splitor)) {
  116. boolean isMatch = input.getPackage().getName().startsWith(strPackage);
  117. if (isMatch) {
  118. return true;
  119. }
  120. }
  121. return false;
  122. };
  123. }
  124. private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
  125. return Optional.fromNullable(input.declaringClass());
  126. }
  127. }