web-dev-qa-db-ja.com

Swagger APIからのデフォルトの基本エラーコントローラーの回避

私のスプリングブートプロジェクトではswagger2を使用しています。うまく機能していますが、basic-error-controllerをAPIから除外する必要があります。現在、私は正規表現を使用して次のコードを使用しています。それは機能していますが、これを行うための完璧な方法はありますか?.

コード:

@Bean
public Docket demoApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.regex('(?!/error.*).*'))
            .build()
}
23
Pranav C Balan

グーグルで検索した後、私はGitHubの1つの問題から解決策を得ました、[質問]どのように基本エラーコントローラーがswaggerの説明に追加されないように除外するのですか?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()
}
31
Pranav C Balan

多くの時間が経過しましたが、誰かが同じ問題を抱えている場合は、RestControllerのセレクターを提供することでそれを行うことができます。

new Docket(SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build();

コントローラは@ RestControllerで注釈されていることに注意してください

カスタム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"
    }
}
3
Tobias

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によってレンダリングされません。

3

同じ問題が発生しました。これは私がしました。

Java
@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
            .paths(PathSelectors.any())
            .build();
}
2
Evan

あなたがしなければならないことは、すべてのAPIエンドポイントに一致する正規表現を書くことです。マイクロサービスを実行している場合は、おそらく1単語の一致になります私。

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(RequestHandlerSelectors.any())
        .paths(PathSelectors.regex("/accounts.*"))
        .build();
}
1
Gerson Sosa

私の場合、@ 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();}
0