web-dev-qa-db-fra.com

Pourquoi l'interface utilisateur de springfox-swagger2 me dit-elle "Impossible de déduire l'URL de base".

Pourquoi l'interface utilisateur de springfox-swagger2 me dit-elle Unable to infer base url. Autant que je sache, j'utilise une configuration Swagger Spring-Boot typique. 

Comme vous pouvez le voir sur la capture d'écran, l'URL swagger-fox supportant l'interface utilisateur est example.com/api. REMARQUE: Je reçois un Whitelabel Error Page Spring standard lorsque je navigue vers: https: // localhost: 9600/api/v2/api-docs/ . Je soupçonne que c'est la racine du problème? Je ne vois aucune erreur si Spring n'a pas chargé springfox-swagger2 et je ne sais donc pas pourquoi cela ne fonctionne pas.

 enter image description here

Ma configuration ressemble à ceci (et j'ai essayé toutes sortes de variantes de cette configuration, en cherchant des conseils sur le net):

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

Et

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

NOTE: Fait intéressant, lorsque j'essaie la version 2.6.0, je ne reçois pas le menu contextuel modal, mais mon interface utilisateur Swagger affiche le contenu 0 api. Donc, je sais que le modal doit être assez nouveau?

S'il n'y a pas assez d'informations ici, laissez-moi un commentaire.

14
djangofan

Il s’est avéré que la solution à mon problème consistait à déplacer l’annotation @EnableSwagger2 dans la classe de configuration principale, ainsi que le bean Docket. 

J'avais créé une classe distincte dans un sous-package avec le bean Docket et je m'attendais à ce qu'elle soit scannée par Spring et charge le bean. Peut-être que j'ai omis d'annoter cette classe de dossiers avec @Component, ou peut-être que le problème était autre chose, mais je l'ai fait fonctionner.

2
djangofan

J'ai pu résoudre le problème en ajoutant SpringBootApplication avec une annotation - comme suggéré par Mark: 

@EnableSwagger2
17
Shiva Achari

Pour moi, le problème était que Spring Security ne permettait pas l'accès à certaines ressources nécessaires à swagger-ui. La solution consistait à autoriser l'accès anonyme aux chemins suivants:

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

Dans mon cas, il est normal que ces ressources soient accessibles sans authentification.

10
Northmoor

Étendez simplement votre classe principale avec SpringBootServletInitalizer . Cela fonctionnera très bien . Prenez la référence ci-dessous.

public class TestApp extends SpringBootServletInitializer{

    public static void main(String[] args) {

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

Pour Spring 2, utilisez l'annotation @SpringBootApplication et étend votre application de classe à partir de SpringBootServletInitializer, puis substituez la méthode SpringApplicationBuilder.

@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