避免招摇过市的默认基本错误控制器 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().

中找到了一个问题的解决方案

使用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"
    }
}