webentwicklung-frage-antwort-db.com.de

Warum sagt mir die Benutzeroberfläche von springfox-swagger2 "Basis-URL kann nicht abgeleitet werden."

Warum sagt mir die Benutzeroberfläche von springfox-swagger2 Unable to infer base url. Soweit ich weiß, verwende ich eine typische Swagger-Springboot-Konfiguration.

Wie Sie auf dem Screenshot sehen können, lautet die Swagger-Fox-URL, die die Benutzeroberfläche unterstützt, example.com/api . ANMERKUNG: Wenn ich zu https: // localhost: 9600/api/v2/api-docs/ navigiere, erhalte ich einen standardmäßigen Spring Whitelabel Error Page. Ich vermute, das ist die Wurzel des Problems? Ich sehe keine Fehler, dass Spring springfox-swagger2 nicht geladen hat, und deshalb weiß ich nicht, warum das nicht funktioniert.

 enter image description here

Meine Konfiguration sieht ungefähr so ​​aus (und ich habe alle möglichen Variationen dieser Konfiguration ausprobiert, indem ich im Internet nach Rat gesucht habe):

@EnableSwagger2
@EnableWebMvc
@ComponentScan(basePackages = {"com.company.project"})
public class SwaggerConfig
{
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud")))
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.data.rest.webmvc")))
                .paths(PathSelectors.any())
                .build();
    }
}

Und

<!-- to generate /swagger-ui.html -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.7.0</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.7.0</version>
</dependency>

HINWEIS: Wenn ich Version 2.6.0 ausprobiere, erhalte ich interessanterweise kein modales Popup, aber meine Swagger-Benutzeroberfläche zeigt 0 API-Inhalte an. Also, ich weiß, dass Modal ziemlich neu sein muss?

Wenn es hier nicht genug Infos gibt, hinterlasse mir einen Kommentar.

14
djangofan

Es stellt sich heraus, dass die Lösung meines Problems darin bestand, die Annotation @EnableSwagger2 zusammen mit der Docket-Bean in die Hauptkonfigurationsklasse zu verschieben. 

Ich hatte eine eigene Klasse in einem Unterpaket mit der Docket-Bean erstellt, und ich hatte erwartet, dass sie von Spring gescannt und die Bean geladen wird. Vielleicht habe ich diese Docket-Klasse nicht mit @Component versehen, oder das Problem war vielleicht etwas anderes, aber ich habe es zum Laufen gebracht.

2
djangofan

Ich konnte das Problem durch Hinzufügen von SpringBootApplication mit Anmerkung beheben - wie von Mark vorgeschlagen: 

@EnableSwagger2
17
Shiva Achari

Für mich bestand das Problem darin, dass Spring Security den Zugriff auf einige von swagger-ui benötigte Ressourcen nicht zuließ. Die Lösung bestand darin, anonymen Zugriff auf die folgenden Pfade zu gewähren:

  • /swagger-ui.html
  • / webjars/**
  • / v2/**
  • / swagger-resources/**

In meinem Fall ist es gut, dass auf diese Ressourcen ohne Authentifizierung zugegriffen werden kann.

10
Northmoor

Erweitern Sie Ihre Hauptklasse einfach mit SpringBootServletInitalizer . Es wird gut funktionieren.

public class TestApp extends SpringBootServletInitializer{

    public static void main(String[] args) {

       SpringApplication.run(TestApp.class, args);
   }
}

Ich benutze Spring Boot.

In meinem Fall habe ich einen Fehler im Paketnamen gemacht. In meinem Projekt lautet der Basispaketname

org.liferayasif.documents

also sollte meine Konfigurationsdatei drin sein

org.liferayasif.documents.config

config -> Sie können einen beliebigen Namen vergeben.

aber aus Versehen habe ich unten einen anderen Paketnamen angegeben

org.liferayasif.config

sobald ich die Konfigurationsdatei in meinem Fall in den richtigen Paketnamen gelegt habe

org.liferayasif.documents.config

dann hat es richtig geklappt.

0
asifaftab87

In meinem Fall setze ich unseren Springboot (2.1.2) mit swagger2 (2.9.2) Anwendung als War-Datei in Tomcat8.5 und erhalten den gleichen Fehler.

Später konnte ich das Problem beheben, indem ich diese Klassendatei AppConfig extends SpringBootServletInitializer Erweiterte.

Meine vollständige AppConfig-Datei

package org.mydomain

import Java.net.URL;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication(scanBasePackages = "org.mydomain")
@EntityScan({"org.mydomain.entity"})
@EnableJpaRepositories({"org.mydomain.repository"})
@EnableSwagger2
@EnableScheduling
public class AppConfig extends SpringBootServletInitializer {

  // We can optionally have spring boot way of starting main method
  public static void main(String[] args) {
     SpringApplication.run(AppConfig.class, args);
  }
}

Dies ist das Blog, in dem ich beschrieben habe, wie Springboot-Anwendungen in Tomcat bereitgestellt werden

Hinweis: Ich habe nicht Swagger Docket konfiguriert, sondern nur die Standardimplementierung verwendet.

0
prem

Ich musste anonymen Zugriff auf Ressourcen in der Spring-Sicherheitsmethode hinzufügen: protected void configure (HttpSecurity http)

.antMatchers("/api/**", "/swagger-ui.html", "/webjars/**", "/v2/**", "/swagger-resources/**").anonymous()

Und dann fängt es an zu funktionieren.

0
Damian JK

Verwenden Sie für Spring 2 die @SpringBootApplication-Annotation, um Ihre Klassenanwendung von SpringBootServletInitializer zu erweitern und die Methode SpringApplicationBuilder zu überschreiben

@SpringBootApplication
public class TestApp extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(TestApp.class);
    }


    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
}
0
Kendy Alvarado