web-dev-qa-db-fra.com

Éviter le contrôleur d'erreur de base par défaut de l'API Swagger

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()
}
23
Pranav C Balan

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()
}
31
Pranav C Balan

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

24

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"
    }
}
3
Tobias

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

3
Henrique Schmitt

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();
}
2
Evan

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();
}
1
Gerson Sosa

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();}
0
Madhusudan Joshi