0
点赞
收藏
分享

微信扫一扫

微服务项目引入knife4j--接口文档(knife4j)

洲行 2022-03-11 阅读 72

使用组件: knife4j, 前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目

使用方式:引入依赖, 可以已纳入最新版本, 然后配置类swagger

<dependency>
      <groupId>com.github.xiaoymin</groupId>
      <artifactId>knife4j-spring-boot-starter</artifactId>
      <version>${knife4j.starter.version}</version>
</dependency>

具体可以参考: http://t.csdn.cn/stFG2

一、 第一步: 网关模块配置

1.1 pom文件啊引入依赖

<!--knife4j接口-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j.starter.version}</version>
</dependency>

版本: 
<knife4j.starter.version>3.0.3</knife4j.starter.version>

2.2 gateway模块配置

类RouteProperties 路由来源, 获取配置文件的服务路由名称

/**
 * 路由配置
 *
 */
@Component
@Data
@RefreshScope
@ConfigurationProperties("project.document")
public class RouteProperties {

   private final List<RouteResource> resources = new ArrayList<>();

}

获取配置中路由的属性值

@Data
public class RouteResource {

   /**
    * 文档名
    */
   private String name;

   /**
    * 文档所在服务地址
    */
   private String location;

   /**
    * 文档版本
    */
   private String version;

}

对应的bootstrap.yml 配置文件, 注意对齐格式, 否则会报错

project:
  document:
    resources:
      - name: 系统模块
        location: /project-system
        version: 1.0.0
      - name: 数据中心
        location: /project-gateway
        version: 1.0.0

 SwaggerProvider

@Primary
@Component
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
   private static final String API_URI = "/v2/api-docs";
   private RouteProperties routeProperties;

   /**
 * 获取路由资源信息, 拼接路由地址
 * @return
 */
    @Override
    public List<SwaggerResource> get() {
       List<SwaggerResource> resources = new ArrayList<>();
       List<RouteResource> routeResources = routeProperties.getResources();
       routeResources.forEach(routeResource -> resources.add(swaggerResource(routeResource)));
       return resources;
    }
    
    private SwaggerResource swaggerResource(RouteResource routeResource) {
       SwaggerResource swaggerResource = new SwaggerResource();
       swaggerResource.setName(routeResource.getName());
       swaggerResource.setLocation(routeResource.getLocation().concat(API_URI));
       swaggerResource.setSwaggerVersion(routeResource.getVersion());
       return swaggerResource;
    }


}

SwaggerResourceHandler: 处理已经加入的模块路由

@Slf4j
@Component
@RequiredArgsConstructor
public class SwaggerResourceHandler implements HandlerFunction<ServerResponse> {
   /* 将已经配置好的路由*/
   private final SwaggerProvider swaggerResources;

   /**
    * Handle the given request.
    *
    * @param request the request to handler
    * @return the response
    */
   @Override
   public Mono<ServerResponse> handle(ServerRequest request) {
      return ServerResponse.status(HttpStatus.OK)
         .contentType(MediaType.APPLICATION_JSON)
         .body(BodyInserters.fromValue(swaggerResources.get()));
   }


}

SwaggerUiHandler:

@Slf4j
@Component
public class SwaggerUiHandler implements HandlerFunction<ServerResponse> {
 
   /**
    * Handle the given request.
    *
    * @param request the request to handler
    * @return the response
    */
   @Override
   public Mono<ServerResponse> handle(ServerRequest request) {
      return ServerResponse.status(HttpStatus.OK)
         .contentType(MediaType.APPLICATION_JSON)
         .body(BodyInserters.fromValue(UiConfigurationBuilder.builder().build()));
   }
}

安全处理类:SwaggerSecurityHandler

@Slf4j
@Component
public class SwaggerSecurityHandler implements HandlerFunction<ServerResponse> {

   /**
    * Handle the given request.
    *
    * @param request the request to handler
    * @return the response
    */
   @Override
   public Mono<ServerResponse> handle(ServerRequest request) {
      return ServerResponse.status(HttpStatus.OK)
         .contentType(MediaType.APPLICATION_JSON)
         .body(BodyInserters.fromValue(SecurityConfigurationBuilder.builder().build()));
   }
}

获取跳过的url: AuthProperties 在nocos配置或者配置文件配置的信息

@Component
@Data
@RefreshScope
@ConfigurationProperties("project.gateway")
public class AuthProperties {

   /**
    * 放行API集合
    */
   private final List<String> skipUrl = new ArrayList<>();

}

最后上面的都汇总到配置类:SwaggerRouterFunctionConfiguration

@Slf4j
@Configuration
@AllArgsConstructor
@EnableConfigurationProperties({RouteProperties.class, AuthProperties.class})
public class SwaggerRouterFunctionConfiguration {

   private final SwaggerResourceHandler swaggerResourceHandler;
   private final SwaggerSecurityHandler swaggerSecurityHandler;
   private final SwaggerUiHandler swaggerUiHandler;

   @Bean
   public RouterFunction routerFunction() {
      return RouterFunctions.route(RequestPredicates.GET("/swagger-resources")
         .and(RequestPredicates.accept(MediaType.ALL)), swaggerResourceHandler)
         .andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui")
            .and(RequestPredicates.accept(MediaType.ALL)), swaggerUiHandler)
         .andRoute(RequestPredicates.GET("/swagger-resources/configuration/security")
            .and(RequestPredicates.accept(MediaType.ALL)), swaggerSecurityHandler);
   }

}

以上就是gateway配置的信息

二、第二步: 配置其他模块

可以放在公共模块,这样其他模块就可以不用再进行配置, 引入公共模块就可以

2.1 首先也是引入依赖:模块project-common的pom文件

 

<!--knife4j接口-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j.starter.version}</version>
</dependency>

版本: 
<knife4j.starter.version>3.0.3</knife4j.starter.version>

版本3.0.3

2.2 创建配置类, 也放在公共模块里

/**
 * 对Swagger2的配置信息
 *
 * @author
 */
@Configuration
@EnableSwagger2   // 必需
@EnableKnife4j    // 必需
public class SwaggerConfig {
    private static final String VERSION = "1.0.0";

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.zhyqin"))   // 配置扫描的包路径, 可以把范围放大些
            .paths(PathSelectors.any())
            .build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
            .title("project-系统接口文档")
            .contact(new Contact("自学项目学习","","xxxx@163.com"))
            .description("project接口文档")
            .version(VERSION)
            .build();
    }
}

配置需要加入接口文档的接口信息, 在对应包下的controller里加入对应的注解信息

@Slf4j
@Api(value="ship", tags = "船舶管理")   这是大标题
@RestController
@RequestMapping("/ship")
@AllArgsConstructor
public class ShipController {
 
    @ApiOperation(value = "船舶查询", notes = "根据条件查询船舶")  // 这是小标题
    @PostMapping("/queryByCon")
    public String getData(String userName, String age){
        log.info(" 入参: userName ="+userName +" , age ="+age);
        return "成功!!!!";
    }
 
}

以上就算配置完成

调用接口: 网关的地址 : http://localhost:8844/doc.html#/home

然后它会自动调用http://localhost:8844/v2/api-docs 来获取数据

举报

相关推荐

0 条评论