18

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'
tkruse
  • 10,222
  • 7
  • 53
  • 80
user9232119
  • 271
  • 1
  • 2
  • 6
  • Your log does not specifically show that /example/swagger-ui.html is being mapped. This html file should be copied to somewhere where spring will pick it up. Depending on how you start your system, the problem could be anywhere, such as your gradle files or IDE configuration. Probably easiest for you to go back version by version until you find the change that introduced this failure. – tkruse Jan 18 '18 at 07:44
  • related: https://stackoverflow.com/questions/32194250/unable-to-bring-up-swagger-ui-from-spring-boot-application. Also note there are several issue tickets on swagger github project that might help you identify the problem. – tkruse Jan 18 '18 at 07:46
  • https://stackoverflow.com/a/64333853/410439 – Ravi Parekh Nov 11 '20 at 19:55
  • Does this answer your question? [Added Springfox Swagger-UI and it's not working, what am I missing?](https://stackoverflow.com/questions/46151540/added-springfox-swagger-ui-and-its-not-working-what-am-i-missing) – Ravi Parekh Nov 11 '20 at 19:55
  • I found this answer the best for Spring Boot 3.0+ https://stackoverflow.com/a/74773479/14062144 – Ilya Lisov Jan 23 '23 at 11:28

19 Answers19

51

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

abhishek1030
  • 633
  • 6
  • 8
  • 12
    Yeah, mind that slash at the end! `http://localhost:8080/swagger-ui/` – Tom Sep 28 '20 at 09:53
  • 1
    This solution works. In a microservice environment, your URL should be `http://localhost:{{port number of your service}}/swagger-ui/` – Harihara_K Jan 11 '21 at 12:34
  • 1
    As @Tom said, it's `http://localhost:8080/swagger-ui/` and not `http://localhost:8080/swagger-ui.html` – azmirfakkri Jun 23 '21 at 20:07
9

For Swagger 3.0, the URL is changed

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

dhamo dharan
  • 712
  • 1
  • 10
  • 25
7

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.

user9232119
  • 271
  • 1
  • 2
  • 6
6

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.

Paul Roub
  • 36,322
  • 27
  • 84
  • 93
J. Reis Jr
  • 71
  • 1
  • 3
6

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.

  • this is a combination of swagger 2.0 and 3.0 dependencies and seems to be a mismatch. you're using a 3.0 dependency with a 2.0 dependency and will cause a dependency mismatch , hmmmm. I did tried this, anmd id did errored out on compile with "Correct the classpath of your application so that it contains a single, compatible version of springfox.documentation.builders.RequestHandlerSelectors" – iamjoshua Sep 28 '21 at 09:28
  • 1
    In my case, last slash is strictly required. `http://localhost:8080/swagger-ui/`, not `http://localhost:8080/swagger-ui` – Shark Deng May 29 '22 at 11:45
  • I have the same problem but I couldn't open it. Here is the link : https://stackoverflow.com/questions/75391306/cannot-open-swagger-2-in-spring-boot-3-app – S.N Feb 08 '23 at 20:54
5

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.

dante
  • 142
  • 1
  • 8
2

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 
VSK
  • 359
  • 2
  • 5
  • 20
  • for SpringFox version 3.0.0 the solution is here: https://github.com/springfox/springfox – S34N Oct 25 '20 at 10:42
1

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

jkdev
  • 11,360
  • 15
  • 54
  • 77
1

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 i.e 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

1

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

Procrastinator
  • 2,526
  • 30
  • 27
  • 36
0

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

}.

Prasad Giri
  • 108
  • 8
0

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.

S34N
  • 7,469
  • 6
  • 34
  • 43
0

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)

0

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

P.S: tested in spring boot (v2.5.0)

drac_o
  • 427
  • 5
  • 11
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);
   }

}
0

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/

Saurabh
  • 449
  • 4
  • 7
0

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.

0

if you use spring 3 like me, make sure to use these dependencies:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
       <groupId>org.springdoc</groupId>
       <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
       <version>2.0.2</version>
    </dependency>

make sure to remove the annotation @EnableSwagger2 because it's not necessary in spring 3 as mentioned here https://github.com/springfox/springfox

  • For spring-boot v3 support, please read the documentation and the "Getting started" guide here: https://springdoc.org/v2/#getting-started Also the first block of your answer seems to be wrong, as the guide recommends to "Remove springfox and swagger 2 dependencies. Add springdoc-openapi-starter-webmvc-ui dependency instead." – Sbl Mar 03 '23 at 17:26
0

I am running on Java 11.0.8 and my project folder is based on Springboot 2.7.13

pom.xml

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

<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>2.1.9</version>
</dependency>

SwaggerConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
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)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo")) // Update with your controller package
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Your API Documentation")
                .description("API documentation for your Spring Boot project")
                .version("1.0.0")
                .build();
    }
}


DemoApplication.java --Where the Springboot starts--

...
@SpringBootApplication
@EnableSwagger2 //<-- add these annotation
@EnableWebMvc   //<--
public class DemoApplication {


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

}

You can use the @EnableWebMvc annotation either for the controller classes (adding the annotation for every controller) or just the main class.

You can remove this if you have this set in the application.properties file.
It works without it.

#spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER
Nati
  • 51
  • 3