私のスプリングブートプロジェクトではswagger2を使用しています。うまく機能していますが、basic-error-controller
をAPIから除外する必要があります。現在、私は正規表現を使用して次のコードを使用しています。それは機能していますが、これを行うための完璧な方法はありますか?.
コード:
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex('(?!/error.*).*'))
.build()
}
グーグルで検索した後、私は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()
}
多くの時間が経過しましたが、誰かが同じ問題を抱えている場合は、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"
}
}
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();
}
あなたがしなければならないことは、すべてのAPIエンドポイントに一致する正規表現を書くことです。マイクロサービスを実行している場合は、おそらく1単語の一致になります私。
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/accounts.*"))
.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();}