J'utilise swagger2 dans mon projet Spring Boot. Cela fonctionne bien, mais je dois exclure le basic-error-controller
depuis l'api. Actuellement, j'utilise le code suivant en utilisant regex. Cela fonctionne, mais existe-t-il un moyen parfait de le faire?.
CODE:
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex('(?!/error.*).*'))
.build()
}
Après avoir recherché dans google, j'ai obtenu la solution d'un problème dans GitHub, [question] Comment exclure le contrôleur d'erreur de base d'être ajouté à la description du swagger?. Cela peut être fait en utilisant Predicates.not()
.
Le code ressemble à ce qui suit après avoir utilisé 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()
}
Beaucoup de temps s'est écoulé, mais si quelqu'un a le même problème, vous pouvez le faire en fournissant un sélecteur pour RestController:
new Docket(SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
Gardant à l'esprit que vos contrôleurs sont annotés avec @ RestController
Si vous utilisez un ErrorController
personnalisé, annotez-le simplement avec
@ApiIgnore
ou
@Api(hidden = true)
par exemple:
@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"
}
}
La meilleure façon que j'ai trouvée de limiter les points de terminaison affichés par la documentation de swagger est la suivante:
@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();
}
Ainsi, chaque point de terminaison qui ne commence pas par les contextes de la méthode chemins () ne sera pas rendu par swagger
J'ai rencontré le même problème. J'ai fait ça.
Java
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
.paths(PathSelectors.any())
.build();
}
Ce que je pense que vous devriez faire, c'est écrire des expressions rationnelles qui correspondent à tous vos points de terminaison API, si vous exécutez des microservices, ce ne sera probablement qu'une correspondance d'un mot si vous ne le faites pas, alors peut-être que quelque chose que vous posez dans la question est plus logique moi.
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/accounts.*"))
.build();
}
Dans mon cas, lorsque je crée une méthode en tant que @Bean, elle n'affiche pas le contrôleur d'erreur de base.
Si je supprime @Bean, il affichera basic-error-controller dans swagger-ui.
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage(CONTROLLER_PATH))
.paths(regex("/.*")).build();}