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.
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.
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.
J'ai pu résoudre le problème en ajoutant SpringBootApplication avec une annotation - comme suggéré par Mark:
@EnableSwagger2
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:
Dans mon cas, il est normal que ces ressources soient accessibles sans authentification.
É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);
}
}
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);
}
}