web-dev-qa-db-fra.com

Impossible d'obtenir l'interface utilisateur Swagger avec Spring Boot

J'essaie de faire en sorte que Swagger UI fonctionne avec Spring Boot 1.2.1. J'ai suivi les instructions sur https://github.com/martypitt/swagger-springmvc et j'ai ajouté @EnableSwagger sur ma config de printemps.

Je récupère actuellement JSON lorsque je vais à http://localhost:8080/api-docs mais pas de Nice HTML.

J'utilise Maven et j'ai ajouté la dépendance à swagger-ui:

<dependency>
    <groupId>org.ajar</groupId>
    <artifactId>swagger-spring-mvc-ui</artifactId>
    <version>0.4</version>
</dependency>

Voici ma liste complète des dépendances:

<dependencies>
        <dependency>
            <groupId>com.mangofactory</groupId>
            <artifactId>swagger-springmvc</artifactId>
            <version>0.9.4</version>
        </dependency>
        <dependency>
            <groupId>org.ajar</groupId>
            <artifactId>swagger-spring-mvc-ui</artifactId>
            <version>0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

J'ai aussi essayé http://localhost:8080/docs/index.html en tant qu'URL, mais cela donne simplement la "Page d'erreur Whitelabel"

Mise à jour:

J'ai créé un projet de test sur Github pour montrer le problème: https://github.com/wimdeblauwe/springboot-swagger-test

21
Wim Deblauwe

Votre problème réside dans votre fichier SwaggerConfiguration. Vous devez souscrire @EnableWebMvc, car cela entraîne le remplacement du résolveur de vue Spring Boot par défaut par celui par défaut 'SpringWebMvc' qui sert différemment le contenu statique.

Par défaut, Spring Boot servira le contenu statique de l'un des répertoires suivants:

  • / META-INF/ressources /
  • /Ressources/
  • /statique/
  • /Publique/

y compris les webjars.

J'ai eu le même problème et je l'ai trouvé dans la documentation: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html # boot-features-spring-mvc-auto-configuration

Si vous souhaitez prendre le contrôle complet de Spring MVC, vous pouvez ajouter votre propre @Configuration annoté avec @EnableWebMvc. Si vous souhaitez conserver les fonctionnalités Spring Boot MVC et que vous souhaitez simplement ajouter une configuration MVC supplémentaire (intercepteurs, formateurs, contrôleurs de vue, etc.), vous pouvez ajouter votre propre @Bean de type WebMvcConfigurerAdapter, mais sans @EnableWebMvc.

J'espère que ça aide.

31
Tamas

J'ai swagger-ui v0.4 (avec spring v4.14 et swagger-springmvc v0.9.4) qui fonctionne bien, même si j'ai eu des problèmes similaires au début. Il semble que cette classe fasse l'affaire.

@Configuration
@EnableSwagger
public class SwaggerConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private SpringSwaggerConfig springSwaggerConfig;

    @Bean
    public SwaggerSpringMvcPlugin customImplementation() {
        return new SwaggerSpringMvcPlugin(springSwaggerConfig).apiInfo(
                apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfo(/* strings */);
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

Je crois que la chose pertinente est le configureDefaultServletHandling remplacé. Et sur mon WebApplicationInitializer principal, j'ai:

@Import(SwaggerConfig.class)

Enfin, j'ai résolu le problème avec la zone d'emplacement de l'interface utilisateur affichant " http: // localhost: 808 $ {pageContext.request.contextPath}/api-docs" en l'incluant dans mes dépendances:

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <!--<version>8.0.15</version>-->
    <scope>provided</scope>
</dependency>

Cela fournit quelque chose lié au traitement JSP. Il est inclus dans les dépendances de spring-boot, mais ce n'est pas normalement provided.

J'espère que cela pourra aider.

2
Lucas Ross

J'ai le même problème mais ce lien fonctionne pour moi: http: // localhost: 8080/sdoc.jsp

Il préremplit la boîte d'URL de ressource d'interface utilisateur swagger avec: http: // localhost: 808 $ {pageContext.request.contextPath}/api-docs

et quand je le modifie à la main en supprimant $ {pageContext.request.contextPath} et en appuyant sur Explorer, il me montre mon doc api et je peux même essayer mes points de terminaison avec succès. Donc, c'est définitivement un problème, mais probablement pas en récupérant $ {pageContext.request/contextPath}.

En regardant la source, le javascript a: url: window.location.Origin + "$ {pageContext.request.contextPath}/api-docs"

sur un swagger statique ui html j'ai cette pièce est codée comme:

discoveryUrl: "./ resource-list.json"

J'espère que c'est un peu utile

1
Borna