I'm pretty much new to Swagger and I started Documenting very simple my web service that I've build using Spring Boot.
The problem is, After I configure swagger, in the browser when I type localhost:8080/swagger-ui.html I get this following screen with some weird popup message that says "Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway".
I do know it may seems repeated question, but I couldn't resolve this at all with all those answers given. Following, I've posted the screenshot and complete code where I didn't what went wrong. Please make me understand If I went wrong.
Screen shot:
Code
SwaggerConfig.java
package com.test.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static springfox.documentation.builders.PathSelectors.regex;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.paths(regex("/greet.*"))
.build();
}
}
TestApplication.java
package com.test.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages="com.test.controllers")
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
TestController.java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/greet")
public class TestController {
@RequestMapping
public String getGreeting() {
return "Hello There";
}
}
In the above code both SwaggerConfig.java and TestApplication.java belongs to same package i.e com.test.config and TestController.java belongs to com.test.controllers
This is all the code I've and in the pom.xml I've two following dependencies
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
I solved it adding the annotation @EnableSwagger2
on Application class.
@SpringBootApplication
@EnableSwagger2 //this
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
I was facing the same issue when deploying the Spring-boot application as a war artifact. While running the application with the embedded tomcat(as an standalone spring-boot app) it was working fine where as while deploying the war file to remote tomcat facing the above issue.
On bit of dig around, I found that I was missing the Servlet Initializer for my application for the war archive.
Following worked for me like a charm.
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
return application.sources(TestApplication.class);
}
}
if Swagger is behind any auth, you need to do following in SpringBoot Security
http.authorizeRequests().antMatchers("/swagger-resources/**").permitAll().anyRequest().fullyAuthenticated();
Then you access Swagger UI Documentation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With