Abhisar Swami
Abhisar Swami

Reputation: 135

Not able to get Swagger UI with spring boot

I am following the article at http://raibledesigns.com/rd/entry/documenting_your_spring_api_with.

Everything works fine but not able to integrate Swagger UI.

http://localhost:8080/docs/index.html  

results in /error redirection.

Upvotes: 8

Views: 7627

Answers (4)

mh377
mh377

Reputation: 1836

Here is my working configuration incase it helps anyone else

@Configuration
@EnableSwagger2
@Profile({"!production"})
public class SwaggerConfiguration extends WebMvcConfigurerAdapter {

    @Autowired
    private ServletContext servletContext;

    @Bean
    public Docket api() {

        return new Docket(DocumentationType.SWAGGER_2)
                .host("localhost")
                .directModelSubstitute(LocalDate.class, Date.class)
                .pathProvider(new RelativePathProvider(servletContext) {
                    @Override
                    public String getApplicationBasePath() {
                        return "/docs";
                    }
                })
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

Since I am also using Spring security, I also had to add the following to my whitelist:

private String[] swaggerWhiteList = {"/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/swagger.json", "/webjars/**"};

Then I could access it using the following url:

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

Upvotes: 0

Prashanth Debbadwar
Prashanth Debbadwar

Reputation: 1047

I too face same problem. I was able to see json but not swagger ui after adding dest folder aslo. In initialize class which extends SpringBootServletInitializer I added below method then it was working perfect

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

please refer link

Upvotes: 0

nijogeorgep
nijogeorgep

Reputation: 762

I'm answering this with swagger2 configuration inside a gradle based spring boot application. Following are the configuration required for Swagger2.

Add Gradle Configuartion

Add Gradle dependencies inside build.gradle file

dependencies {
    compile("io.springfox:springfox-swagger2:2.0.2")
    compile("io.springfox:springfox-swagger-ui:2.0.2")
    }

Swagger2 Confugration Class

@Configuration
@EnableSwagger2
public class SwaggerConfig {
  @Bean
  public Docket userApi() {
    return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any())
        .paths(PathSelectors.any()).build().pathMapping("/")
        .directModelSubstitute(LocalDate.class, String.class)
        .genericModelSubstitutes(ResponseEntity.class)
        .alternateTypeRules(newRule(
            typeResolver.resolve(DeferredResult.class,
                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
            typeResolver.resolve(WildcardType.class)))
        .useDefaultResponseMessages(false)
        .globalResponseMessage(RequestMethod.GET,
            newArrayList(new ResponseMessageBuilder().code(500).message("500 message")
                .responseModel(new ModelRef("Error")).build()))
        .securitySchemes(newArrayList(apiKey())).securityContexts(newArrayList(securityContext()))
        .apiInfo(apiInfo());
  }

  @Autowired
  private TypeResolver typeResolver;

  private ApiKey apiKey() {
    return new ApiKey("mykey", "api_key", "header");
  }

  private SecurityContext securityContext() {
    return SecurityContext.builder().securityReferences(defaultAuth())
        .forPaths(PathSelectors.regex("/anyPath.*")).build();
  }

  List<SecurityReference> defaultAuth() {
    AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
    authorizationScopes[0] = authorizationScope;
    return newArrayList(new SecurityReference("mykey", authorizationScopes));
  }

  @Bean
  SecurityConfiguration security() {
    return new SecurityConfiguration("123456", "test-app-realm", "clientapp", "apiKey");
  }

  @Bean
  UiConfiguration uiConfig() {
    return new UiConfiguration("validatorUrl");
  }

  private ApiInfo apiInfo() {
    ApiInfo apiInfo = new ApiInfo("DSM API", "API for DSM", "1.0.0", "termsOfServiceUrl",
        "[email protected]", null, null);
    return apiInfo;
  }

}

Add Swagger UI

Download the Swagger UI from github. Copy the dist folder into your src/main/resources/static directory and rename dist to swagger

HomeController.class

@Api(basePath = "/", value = "/", description = "Home Controller")
@Controller
public class HomeController {

  @RequestMapping("/")
  public String home() {
    return "redirect:swagger-ui.html";
  }

}

MyApplication.class

@SpringBootApplication
@ComponentScan(basePackageClasses = SwaggerConfig.class)
public class MyApplication {

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


}

Configure your spring boot application with dependencies and run to see the API.

the url will be http://localhost:8080/v2/swagger-ui.html you can also customize this as above answer.

Upvotes: 2

Smajl
Smajl

Reputation: 7995

I know this is an old question but maybe this will help someone with the similar problem in the future.

I followed similar tutorial to the one you mentioned and I made it work without a problem. I put my own document on how to setup a Swagger with UI in a Spring boot project couple of weeks ago. Maybe it will help you out since it is shorter and more up-to-date.

Add Maven dependencies

Stick these in your pom.xml:

<dependency>
 <groupId>com.mangofactory</groupId>
 <artifactId>swagger-springmvc</artifactId>
 <version>1.0.2</version>
 <type>jar</type>
</dependency>

Add Swagger UI

Download the Swagger UI from github. Copy the dist folder into your webapp directory and rename dist to swagger (or any name you like).

Open the index.html file inside the copied directory and change the url in the first javascript function so it points to the /api-docs endpoint:

var url = window.location.search.match(/url=([^&]+)/);
  if (url && url.length > 1) {
  url = decodeURIComponent(url[1]);
  } else {
  url = "/project-name/api-docs";
 }

Configure Swagger

Create a SwaggerConfig.java class and configure swagger there:

@Configuration
@EnableSwagger
@EnableAutoConfiguration
public class SwaggerConfig {
  private SpringSwaggerConfig springSwaggerConfig;
  @Autowired
  public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
    this.springSwaggerConfig = springSwaggerConfig;
  }
  @Bean
  public SwaggerSpringMvcPlugin customImplementation() {
    return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
    // Root level documentation
    .apiInfo(new ApiInfo("Swagger-demo JSON API", "This service provides a JSON representation the service API", null, null, null, null))
    .useDefaultResponseMessages(false)
    // Map the specific URL patterns into Swagger
    .includePatterns("/greeting.*");
  }
}

Your swagger should be up and running now. Try accessing /project-name/swagger/index.html.

Upvotes: 2

Related Questions