大摇大摆地过滤 API 个部分
Filtering for API parts in swagger
我有一个 REST API 和 springfox swagger v2.6.1,并且可以正常工作。但是现在,我不想总是显示我拥有的所有控制器,因为其中一些非常技术性,不适合普通用户,但我希望能够选择我显示的内容而无需重新编译代码。页面顶部有一个下拉字段,上面写着 'default (/v2/api-docs)'(或您配置的任何内容),只有一个条目。我的直觉是那里应该可以有多个选项,并根据选项显示某些控制器 类 或不显示。
由于我不太会上传图片,所以无法提供截图。无论如何,我希望我的问题很清楚。
在我的项目中做 swagger 的代码是最简单的:
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis( RequestHandlerSelectors.any() )
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title( "My awesome ACS API" )
.description( "All the requests that the server will respond to." )
.version( "1.0.0" )
.build();
}
我尝试了几种方法,比如添加一些属性,为不同的东西做两个 .select() 和 selecting,但我似乎并没有真正接近我希望的东西实现。
感谢您的帮助!
我能想到的一些方案
您可以使用 SpringSecurity 将身份验证添加到不同的端点,并使端点完全不可访问(但在 Swagger 中可见 UI)。
您在顶部提到的下拉菜单可以这样配置
@Bean
public Docket orderApi() {
// This will group the endpoints strting with /order.
// And it will be visible as a separate group in the drop down(In Swagger UI)
// with the name 'order' as specified in the groupName(..)
return new Docket(DocumentationType.SWAGGER_2)
.groupName("order")
.apiInfo(metadata())
.select()
.paths(PathSelectors.ant("/order/**"))
.build();
}
@Bean
public Docket orderValidationApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("product")
.apiInfo(metadata())
.select()
.paths(PathSelectors.ant("/product/**"))
.build();
}
您可以在 Docker 配置
中完全排除端点在 Swagger UI 中可见
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis( RequestHandlerSelectors.any() )
.paths(PathSelectors.regex("(?!/error).+")).paths(PathSelectors.regex("(?!/product).+"))
.build()
.apiInfo( metadata() );
这将使所有不是 /error 和 /product 的端点可用。您可以像这样过滤掉端点。
您也可以提供包名
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.basePackage("com.hello.world.controller.user"))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
或者您可以为您的 API 类 或 API 方法使用自定义注释,如下所示:
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(MyCustomClassAnnotation.class))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(MyCustomMethodAnnotation.class))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
我有一个 REST API 和 springfox swagger v2.6.1,并且可以正常工作。但是现在,我不想总是显示我拥有的所有控制器,因为其中一些非常技术性,不适合普通用户,但我希望能够选择我显示的内容而无需重新编译代码。页面顶部有一个下拉字段,上面写着 'default (/v2/api-docs)'(或您配置的任何内容),只有一个条目。我的直觉是那里应该可以有多个选项,并根据选项显示某些控制器 类 或不显示。
由于我不太会上传图片,所以无法提供截图。无论如何,我希望我的问题很清楚。
在我的项目中做 swagger 的代码是最简单的:
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis( RequestHandlerSelectors.any() )
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title( "My awesome ACS API" )
.description( "All the requests that the server will respond to." )
.version( "1.0.0" )
.build();
}
我尝试了几种方法,比如添加一些属性,为不同的东西做两个 .select() 和 selecting,但我似乎并没有真正接近我希望的东西实现。
感谢您的帮助!
我能想到的一些方案
您可以使用 SpringSecurity 将身份验证添加到不同的端点,并使端点完全不可访问(但在 Swagger 中可见 UI)。
您在顶部提到的下拉菜单可以这样配置
@Bean public Docket orderApi() { // This will group the endpoints strting with /order. // And it will be visible as a separate group in the drop down(In Swagger UI) // with the name 'order' as specified in the groupName(..) return new Docket(DocumentationType.SWAGGER_2) .groupName("order") .apiInfo(metadata()) .select() .paths(PathSelectors.ant("/order/**")) .build(); } @Bean public Docket orderValidationApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName("product") .apiInfo(metadata()) .select() .paths(PathSelectors.ant("/product/**")) .build(); }
您可以在 Docker 配置
中完全排除端点在 Swagger UI 中可见return new Docket( DocumentationType.SWAGGER_2 ) .select() .apis( RequestHandlerSelectors.any() ) .paths(PathSelectors.regex("(?!/error).+")).paths(PathSelectors.regex("(?!/product).+")) .build() .apiInfo( metadata() );
这将使所有不是 /error 和 /product 的端点可用。您可以像这样过滤掉端点。
您也可以提供包名
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.basePackage("com.hello.world.controller.user"))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
或者您可以为您的 API 类 或 API 方法使用自定义注释,如下所示:
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(MyCustomClassAnnotation.class))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}
@Bean
public Docket api() {
return new Docket( DocumentationType.SWAGGER_2 )
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(MyCustomMethodAnnotation.class))
.paths( PathSelectors.any() )
.build()
.apiInfo( metadata() );
}