0
votes

Impossible d'afficher les documents Swagger / OpenApi lors de l'utilisation du support SpringDoc webflux

J'ai un petit micro-service Spring Boot qui expose son point de terminaison comme réactif, en utilisant webflux.

Lorsque j'exécute l'application depuis IntelliJ, Gradle ou depuis la ligne cmd avec le support SpringDoc webflux:
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.4'
et je vais sur http://localhost:8080/swagger-ui.html j'obtiens une erreur 500, les journaux montrent:

java.lang.IllegalStateException: No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest]

et la cause profonde:

java.lang.NoSuchMethodException: org.springframework.http.server.reactive.ServerHttpRequest.<init>()

si j'utilise http://localhost:8080/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config j'obtiens un 404 au lieu d'un 500.

Cependant, si je change la dépendance au module SpringDoc non réactif:
implementation 'org.springdoc:springdoc-openapi-ui:1.4.4'

Les documents sont disponibles, ils ne montrent tout simplement pas le schéma de retour (je suppose que cela est attendu car la réponse est enveloppée dans un Mono ).

J'ai regardé cette question, mais cela n'a pas aidé

J'utilise Spring Boot 2.3.3.RELEASE, je n'ai rien de «fantaisie» dans le contrôleur autre qu'une classe de service câblée automatiquement, le point de terminaison est simplement annoté avec GetMapping et renvoie Mono<T> . et j'ai inclus les dépendances suivantes:

    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.4'


0 commentaires

3 Réponses :


1
votes

Votre projet utilise spring-boot-starter-web et spring-boot-starter-webflux.

Il vous suffit de supprimer spring-boot-starter-web de vos dépendances.


2 commentaires

Ah, c'est un peu un problème, car le module d'analyse des applications Azure ne prend pas en charge webflux actuellement (bien qu'il semble qu'ils aient une version préliminaire disponible qui le fasse), dès que je serai en mesure de mettre à niveau le module azure, je reviendrai sur ceci .


J'ai pu confirmer que cela résoudra mon problème sur un autre projet.



0
votes

J'ai la restriction dont j'ai besoin pour utiliser Webflux via Servlet 3.1, même si ce n'est pas la solution réactive pure, mais je peux réutiliser un filtre de sécurité Spring avec Servlet.

Quoi qu'il en soit, j'ai trouvé une solution pour que springdoc-openapi-ui puisse lire Flux & Mono en ajoutant WebFluxSupportConverter à partir de springdoc-openapi-webflux-core. Consultez le code suivant.

    implementation 'org.springdoc:springdoc-openapi-ui:1.4.6'
    implementation 'org.springdoc:springdoc-openapi-webflux-core:1.4.6'

Il vous suffit donc d'inclure les bibliothèques.

    @Bean
    public OpenAPI customOpenAPI() {

        ModelConverters.getInstance().addConverter(new WebFluxSupportConverter())

        return new OpenAPI()
            .components(new Components()
                .addSecuritySchemes("JWE", new SecurityScheme()
                    .type(SecurityScheme.Type.HTTP)
                    .scheme("bearer")
                    .bearerFormat("JWE")))
            .info(new Info()
                .title("Marketplace API")
                .version(apiVersion))
    }


0 commentaires

0
votes

Pour moi, dans un projet de démarrage de printemps kotlin, le problème était avec un point de terminaison renvoyant un Flux, donc il lançait une exception gracieuse: jackson BeanDescription.findJsonValueAccessor not found, this could lead to inaccurate result, please update jackson to 2.9+ l'approche de @Chayne PS a résolu mon problème:

class OpenApiConfigiguration {

    @Bean
    fun configOpenAPI(): OpenAPI? {
        ModelConverters.getInstance().addConverter(WebFluxSupportConverter())
        return OpenAPI()
                .info(Info().title("API")
                        .description("WS restful API")
                        .version("v0.0.1")
                        .license(License().name("License of API")
                        .termsOfService("Terms of service"))
                .externalDocs(ExternalDocumentation()
                        .description("Docs")
                        .url(""))
    }
}


0 commentaires