避免招摇过市的默认基本错误控制器 api
Avoiding default basic-error-controller from swagger api
我在 spring 引导项目中使用 swagger2。它运行良好,但我需要从 api 中排除 basic-error-controller
。目前我正在使用以下代码使用正则表达式。它正在工作,但有没有完美的方法来做到这一点。
代码:
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex('(?!/error.*).*'))
.build()
}
在 google 中搜索后,我在 GitHub、[question] How to exclude the basic-error-controller from being added to the swagger description?. It can be done using Predicates.not()
.
中找到了一个问题的解决方案
后代码如下所示
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)//<3>
.select()//<4>
.apis(RequestHandlerSelectors.any())//<5>
.paths(Predicates.not(PathSelectors.regex("/error.*")))//<6>, regex must be in double quotes.
.build()
}
很多时间过去了,但如果有人遇到同样的问题,您可以通过为 RestController 提供选择器来解决:
new Docket(SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
请记住,您的控制器使用 @RestController
注释
我发现限制 swagger 文档显示的端点的最佳方法是这样做的:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(paths())
.build().apiInfo(metadata());
}
private Predicate<String> paths() {
return or(
regex("/firstContext.*"),
regex("/secondContext.*"));
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("SomeTitle")
.description("SomeDescription")
.build();
}
因此每个不以 paths() 方法上下文开头的端点都不会被 swagger 渲染
我遇到了同样的问题。我这样做了。
java
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
.paths(PathSelectors.any())
.build();
}
在我的例子中,当我将方法创建为 @Bean 时,它不会显示 basic-error-controller。
如果我删除@Bean,它会在 swagger-ui.
中显示 basic-error-controller
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage(CONTROLLER_PATH))
.paths(regex("/.*")).build();}
我认为你应该做的是编写一些匹配所有 API 端点的正则表达式,如果你是 运行 微服务,那么如果你不这样做,那可能只是一个单词匹配那么也许你提出的问题对我来说更有意义。
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/accounts.*"))
.build();
}
如果您使用的是自定义 ErrorController
,只需将其注释为
@ApiIgnore
或
@Api(hidden = true)
例如:
@Controller
@ApiIgnore
class MyErrorController : ErrorController {
@RequestMapping("/error")
fun handleError(request: HttpServletRequest): String {
val status: String? = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)?.toString()
val statusCode: Int? = status?.toInt()
return when (statusCode) {
HttpStatus.NOT_FOUND.value() -> return "error-404"
HttpStatus.INTERNAL_SERVER_ERROR.value() -> return "error-500"
else -> "error"
}
}
override fun getErrorPath(): String {
return "/error"
}
}
我在 spring 引导项目中使用 swagger2。它运行良好,但我需要从 api 中排除 basic-error-controller
。目前我正在使用以下代码使用正则表达式。它正在工作,但有没有完美的方法来做到这一点。
代码:
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex('(?!/error.*).*'))
.build()
}
在 google 中搜索后,我在 GitHub、[question] How to exclude the basic-error-controller from being added to the swagger description?. It can be done using Predicates.not()
.
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)//<3>
.select()//<4>
.apis(RequestHandlerSelectors.any())//<5>
.paths(Predicates.not(PathSelectors.regex("/error.*")))//<6>, regex must be in double quotes.
.build()
}
很多时间过去了,但如果有人遇到同样的问题,您可以通过为 RestController 提供选择器来解决:
new Docket(SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
请记住,您的控制器使用 @RestController
注释我发现限制 swagger 文档显示的端点的最佳方法是这样做的:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(paths())
.build().apiInfo(metadata());
}
private Predicate<String> paths() {
return or(
regex("/firstContext.*"),
regex("/secondContext.*"));
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("SomeTitle")
.description("SomeDescription")
.build();
}
因此每个不以 paths() 方法上下文开头的端点都不会被 swagger 渲染
我遇到了同样的问题。我这样做了。
java
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
.paths(PathSelectors.any())
.build();
}
在我的例子中,当我将方法创建为 @Bean 时,它不会显示 basic-error-controller。
如果我删除@Bean,它会在 swagger-ui.
中显示 basic-error-controller@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage(CONTROLLER_PATH))
.paths(regex("/.*")).build();}
我认为你应该做的是编写一些匹配所有 API 端点的正则表达式,如果你是 运行 微服务,那么如果你不这样做,那可能只是一个单词匹配那么也许你提出的问题对我来说更有意义。
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/accounts.*"))
.build();
}
如果您使用的是自定义 ErrorController
,只需将其注释为
@ApiIgnore
或
@Api(hidden = true)
例如:
@Controller
@ApiIgnore
class MyErrorController : ErrorController {
@RequestMapping("/error")
fun handleError(request: HttpServletRequest): String {
val status: String? = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)?.toString()
val statusCode: Int? = status?.toInt()
return when (statusCode) {
HttpStatus.NOT_FOUND.value() -> return "error-404"
HttpStatus.INTERNAL_SERVER_ERROR.value() -> return "error-500"
else -> "error"
}
}
override fun getErrorPath(): String {
return "/error"
}
}