web-dev-qa-db-de.com

Swagger UI funktioniert nicht mit Spring Boot

Ich versuche, Swagger UI mit Spring Boot 1.2.1 zum Laufen zu bringen. Ich befolgte die Anweisungen unter https://github.com/martypitt/swagger-springmvc und fügte @EnableSwagger Zu meiner Frühjahrskonfiguration hinzu.

Ich erhalte momentan JSON zurück, wenn ich zu http://localhost:8080/api-docs Gehe, aber kein nettes HTML.

Ich benutze Maven und habe die Abhängigkeit von swagger-ui hinzugefügt:

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

Dies ist meine vollständige Liste der Abhängigkeiten:

<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>

Ich habe auch versucht http://localhost:8080/docs/index.html Als URL, aber das gibt nur die "Whitelabel Error Page"

Aktualisieren:

Ich habe ein Testprojekt auf Github erstellt, um das Problem zu zeigen: https://github.com/wimdeblauwe/springboot-swagger-test

21
Wim Deblauwe

Ihr Problem liegt in Ihrer SwaggerConfiguration -Datei. Sie müssen @EnableWebMvc Entfernen, da dies dazu führt, dass der Standard-Spring-Boot-View-Resolver durch den Standard-SpringWebMvc-Resolver überschrieben wird, der statischen Inhalt auf andere Weise bereitstellt.

Standardmäßig stellt Spring Boot statischen Inhalt aus einem der folgenden Verzeichnisse bereit:

  • / META-INF/Ressourcen /
  • /Ressourcen/
  • /statisch/
  • /Öffentlichkeit/

einschließlich Webjars.

Ich hatte das gleiche Problem und fand es in der Dokumentation: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html # boot-features-spring-mvc-auto-configuration

Wenn Sie die vollständige Kontrolle über Spring MVC übernehmen möchten, können Sie Ihren eigenen @Configuration Hinzufügen, der mit @EnableWebMvc Kommentiert ist. Wenn Sie die MVC-Funktionen von Spring Boot beibehalten und nur zusätzliche MVC-Konfigurationen hinzufügen möchten (Interceptors, Formatierer, View-Controller usw.), können Sie einen eigenen @Bean Vom Typ WebMvcConfigurerAdapter hinzufügen ohne @EnableWebMvc.

Ich hoffe das hilft.

31
Tamas

Ich habe swagger-ui v0.4 (mit spring v4.14 & swagger-springmvc v0.9.4) funktioniert, obwohl ich zuerst einige ähnliche Probleme hatte. Es scheint, als ob diese Klasse den Trick macht.

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

Ich glaube, das Relevante ist das überschriebene configureDefaultServletHandling. Und auf meinem Haupt WebApplicationInitializer habe ich:

@Import(SwaggerConfig.class)

Schließlich behebte ich das Problem mit dem Standortfeld der Benutzeroberfläche, in dem " http: // localhost: 808 $ {pageContext.request.contextPath}/api-docs" angezeigt wurde, indem ich Folgendes in meine Abhängigkeiten einbaute:

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

Das bietet etwas im Zusammenhang mit der JSP-Verarbeitung. Es ist in den Abhängigkeiten von spring-boot Enthalten, aber normalerweise nicht provided.

Ich hoffe, das hilft.

2
Lucas Ross

Ich habe das gleiche Problem, aber dieser Link funktioniert für mich: http: // localhost: 8080/sdoc.jsp

Es füllt das URL-Feld der Swagger-UI-Ressource vorab mit: http: // localhost: 808 $ {pageContext.request.contextPath}/api-docs

und wenn ich es von Hand bearbeite, indem ich $ {pageContext.request.contextPath} entferne und auf Explore drücke, wird mir mein API-Dokument angezeigt und ich kann sogar meine Endpunkte erfolgreich testen. Also definitiv ein Problem, aber wahrscheinlich nicht $ {pageContext.request/contextPath}.

Mit Blick auf die Quelle hat das Javascript: url: window.location.Origin + "$ {pageContext.request.contextPath}/api-docs"

auf einer statischen Prahlerei ui html habe ich dieses Stück wie folgt codiert:

discoveryUrl: "./ resource-list.json"

Ich hoffe das ist ein bisschen hilfreich

1
Borna