简体   繁体   中英

Springboot swagger url shows WhiteLabel Error page

Here is my code: I am getting all the values from application.properties file SwaggerConfig.java

@Configuration
@EnableSwagger2
@Profile("!prod")
@PropertySource(value = { "classpath:application.properties" })
public class SwaggerConfig {

    @Value("${swagger.api.title}")
    private String title;

    @Value("${swagger.api.description}")
    private String description;

    @Value("${swagger.api.termsOfServiceUrl}")
    private String termsOfServiceUrl;

    @Value("${swagger.api.version}")
    private String version;

    @Value("${swagger.api.controller.basepackage}")
    private String basePackage;


    @Bean
    public Docket postMatchApi() {
        return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage(basePackage))
                .paths(PathSelectors.ant("/**")).build().apiInfo(metaData());
    }

    private ApiInfo metaData() {
        return new ApiInfoBuilder().title(title).description(description).termsOfServiceUrl(termsOfServiceUrl)
                .version(version).build();
    }

Here is my springboot initializer:

@SpringBootApplication
@ComponentScan(basePackages = { "com.example.demo" })
@ComponentScan(basePackageClasses = {AppInitializer.class, SwaggerConfig.class})
@EnableAsync
@EnableRetry
public class AppInitializer{

    public static void main(String[] args) {
        SpringApplication.run(AppInitializer.class, args);
    }
}

ServletInitializer.java

public class ServletInitializer extends SpringBootServletInitializer implements WebApplicationInitializer {

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

The log says it is mapped:

[INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[],methods=[POST],consumes=[application/json],produces=[application/json]}" onto public <T> org.springframework.http.ResponseEntity<?> com.,org.springframework.validation.BindingResult) throws java.lang.Exception
    [INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/v2/api-docs],methods=[GET],produces=[application/json || application/hal+json]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)
    [INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/swagger-resources/configuration/ui]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.UiConfiguration> springfox.documentation.swagger.web.ApiResourceController.uiConfiguration()
    [INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/swagger-resources]}" onto org.springframework.http.ResponseEntity<java.util.List<springfox.documentation.swagger.web.SwaggerResource>> springfox.documentation.swagger.web.ApiResourceController.swaggerResources()
    [INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/swagger-resources/configuration/security]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.SecurityConfiguration> springfox.documentation.swagger.web.ApiResourceController.securityConfiguration()
    [INFO ] 2018-01-17 16:46:37.055 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    [INFO ] 2018-01-17 16:46:37.071 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    [INFO ] 2018-01-17 16:46:37.227 [restartedMain] o.s.w.s.m.m.a.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5e89f6: startup date [Wed Jan 17 16:46:34 CST 2018]; root of context hierarchy

This is the error that i get:

    [WARN ] 2018-01-17 16:46:42.217 [http-nio-8082-exec-1] o.s.w.s.PageNotFound - No mapping found for HTTP request with URI [/example/swagger-ui.html] in DispatcherServlet with name 'dispatcherServlet'

For the new Springfox version(3.0.0) you need to do something different

In pom.xml add the following dependency

*

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

instead of two for <artifactId>springfox-swagger2</artifactId> and <artifactId>springfox-swagger-ui</artifactId>

and access ../swagger-ui/ instead of ../swagger-ui.html

I found what the issue was, in one of the config files i somehow had @EnableMvc annotation due to which the dispatcherservlet was looking for the mapping /example/swagger-ui.html and since it could not find one it was complaining "No Mapping found".

After removing @EnableMvc it is working perfectly fine.

For others like me that is still getting the "Whitelabel" page error, check if you have:

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

in your pom.xml file, it's not only the "springfox-swagger2" dependency required as the official doc page shows, you need "springfox-swagger-ui" too.

I faced the same issue. So Basically if you are using spring 3 or more then to open the swagger page , you have to do 3 things only.

  1. Add 3 dependencies in pom.xml

    <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2 </artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency>
  2. Create a config file.

     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; @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2); }

    }

  3. Open this link to access the API.

http://localhost:8080/swagger-ui/

Now just match which step you missed. Do ask if you get stuck somewhere.

I'm bad at English, that's why GoogleTranslate.

That version and way of doing it is already a bit outdated, if you want the documentation to be generated automatically, SpringDoc simplifies the generation and maintenance of API documents, based on the OpenAPI 3 specification, for Spring Boot 1.x and 2.x. applications.

For magic to happen we simply add the dependency to our pom:



    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.2.32</version>
    </dependency>

then access the description that already has it http://localhost:8080/v3/api-docs/

and for swagger: http://localhost:8080/swagger-ui.html

that's all there is to it.

for more detail

if you want to customize the api information you can include java style annotations:



    @OpenAPIDefinition(
        info = @Info(
                 title = "API personas", 
                 description = "Este es un ejemplo de servidor Personas-Server."
            + "Usted puyede encontrar mas acerca de Swagger " ++"[http://swagger.io](http://swagger.io) o en "
            + "[irc.freenode.net, #swagger](http://swagger.io/irc/).",
            termsOfService = "http://swagger.io/terms/", 
              license = @License(
                          name = "Apache 2.0", 
                          url = "http://springdoc.org"), 
       version = "otra"
    ))
    @Tag(name = "persona", description = "API para personas")
    @RestController
    @RequestMapping("persona")
    public class PersonaRest extends GeneralRest {}

can also be generated for special methods:



     @Operation(
         summary = "traer todas las personas", 
         description = "api para traer todas las personas, aqui no se tienen en cuenta paginaciones, ni filtros, trae todos los registros", 
         tags = { "persona" }
         )
     @ApiResponses(
         value = {
         @ApiResponse(
             responseCode = "200", 
             description = "Operación exitosa", 
             content = @Content(
                 mediaType = "application/json", 
                 array = @ArraySchema(
                     schema = @Schema(
                         implementation = PersonaTO.class
                         )))),
         @ApiResponse(
             responseCode = "401", 
             description = "Sin autorización", 
             content = @Content(
                 mediaType = "application/json", 
                 schema = @Schema(
                     implementation = Object.class
                     ))),
     })
     @GetMapping
     public List personas() {
            return personaServicio.obtenerTodo();
        }

it is always good practice to use the most recent libraries and inclusions.

For me it is swagger dependency version.

Issue with

spring boot - 2.3.4
java - 8
swagger - 3.0.0 

No issue with

spring boot - 2.3.4    
java - 8    
swagger - 2.9.2 

Move swagger configuration to your SpringBootApplication class. That will solve the whitable page error.

If your facing the issue even after adding appropriate dependencies Then follow the below steps

1.Go to C:\Users\User.m2
2.Delete the repository folder (Complete folder delete ie Shift+Delete button windows)

This folder bascially contains all the jars that your project requires So when you again open your project it will automatically download the dependencies

first, add below dependencies in spring boot pom file, then add @EnableSwagger annotation on the application class and then add webappconfig class

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.1</version>
    </dependency>


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

@Configuration
@EnableWebMvc
public class ApplicationWebMvcConfig implements WebMvcConfigurer {.   
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

}.

For SpringBoot Ver: 2.4.0-M4 I recommend the following setup. Make sure you use SpringFox ver: 3.0.0

//build.gradle file

def springFoxVer = '3.0.0'
def log4jVer = '2.13.3'

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-rest'
    implementation 'org.springframework.boot:spring-boot-starter-hateoas'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.data:spring-data-rest-hal-explorer'
    implementation "io.springfox:springfox-swagger2:$springFoxVer"
    implementation "io.springfox:springfox-boot-starter:$springFoxVer"
    implementation "io.springfox:springfox-swagger-ui:$springFoxVer"
    implementation "io.springfox:springfox-data-rest:$springFoxVer"
    implementation "org.apache.logging.log4j:log4j-core:$log4jVer"
    implementation "org.apache.logging.log4j:log4j-api:$log4jVer"
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

In the configuration class:

@Configuration
public class SwaggerDocumentationConfig {

    ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Sample Indentity in Project")
                .description("The identity API provides standardized mechanism for identity management such as creation, update, retrieval, deletion. Party can be an individual or an organization that has any kind of relation with the enterprise.   ### Resources - Individual  Party API performs the following operations : - Retrieve an individual - Retrieve a collection of individuals according to given criteria - Create a new individual - Update an existing individual - Delete an existing individual")
                .license("")
                .licenseUrl("http://unlicense.org")
                .termsOfServiceUrl("")
                .version("1.0.0")
                .contact(new Contact("Sean Huni", "https://sean-huni.xyz", "sean2kay@gmail.com"))
                .build();
    }

    @Bean
    public Docket customImplementation() {
        return new Docket(DocumentationType.SWAGGER_2)
                .tags(new Tag("Person Entity", "Repository for People's entities"))
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }

}

In the application-runner/executor class:

@SpringBootApplication
@EnableSwagger2
@EnableJpaRepositories
@Import(SpringDataRestConfiguration.class)
public class SpringSwaggerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringSwaggerApplication.class, args);
    }

}

As instructed here . Most cases just taking the time to read the requirements & the setup process means everything in terms of saving yourself a day of getting stuck.

In my case, I upgraded from swagger 2.7.0 to 3.0.0 and these were the steps to reach the honeypot:

  • add one dependency
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>${swagger.version}</version>
    </dependency>
  • remove two dependencies (but they do not harm, if you forget this step)
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>  
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>
  • The Server-Class now looks like this (unchanged compared to swagger v2.7.0)
@SpringBootApplication(scanBasePackages = {"com.acme.product.server"})
@RestController
@EnableScheduling
@EnableSwagger2
public class AcmeProductServer {
    // [...]

    // --- swagger integration
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.acme.product.server"))
            .build();
    }
}

  • Then I really had to delete and refresh my local maven repository at 'C:\Users\Zaphod.m2\repository'

  • Last issue was to use a different URL: http://localhost:8080/iam/swagger-ui/ (without the trailing slash or '/index.html' at the end it does not work)

Ensure following things along with versions:

  1. dependency is added

     <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
  2. @Bean Dokcet is defined in @SpringBootApplication class

  3. swagger ui endpoint http://localhost:<port-number>/swagger-ui

PS: tested in spring boot (v2.5.0)

To include Swagger in our project, let's add the following annotation to our application void method.

@SpringBootApplication
@EnableSwagger2
public class PostApplication {

   public static void main(String[] args) {
      SpringApplication.run(PostApplication.class, args);
   }

}

Simple install the Spring Fox boot starter and remove the springfox-swagger-ui and springfox-swagger2 from your project.

Gradle:- 
implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'

Maven:- 
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

Also, create a file named SwaggerCondig.java with the below configurations

@Configuration
@EnableSwagger2
public class SwaggerConfig {
  @Bean
  public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2).select()
        .apis(RequestHandlerSelectors.basePackage("com.xxx.xxx.controller"))
        .paths(PathSelectors.any()).build();
  }
}

Access the swagger at http://localhost:9005/service-name/swagger-ui/

In my case I used mvn dependencies

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

calling http://localhost:8088/swagger-ui/ instead of http://localhost:8088/swagger-ui.html works for me. Also check basePackage is correct if you have swagger config file.

If anyone wants to work with Swagger UI then do these 3 simple steps

Step 1 -> Add Dependencies

   <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
   <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>3.0.0</version>
    </dependency>

Step 2 -> Goto main class and give annotation @EnableSwagger2

@SpringBootApplication
@EnableSwagger2
class PracticeApplication {

Step 3 -> Restart server & Just hit http://localhost:8080/swagger-ui/

Note - After doing this if anyone getting - "Failed to start bean 'documentationPluginsBootstrapper"

Then add the below line to application.properties -

spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER

For Swagger 3.0, the URL is changed

http://localhost:8080/swagger-ui/index.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM