Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 963
Abhisar Swami Avatar asked May 20 '14 19:05

Abhisar Swami


People also ask

How can I get Swagger in spring boot?

To enable the Swagger2 in Spring Boot application, you need to add the following dependencies in our build configurations file. For Gradle users, add the following dependencies in your build. gradle file. Now, add the @EnableSwagger2 annotation in your main Spring Boot application.

How do I get to Swagger UI?

Go to http://localhost:8000/ in your address bar. This address lets you view the local web server. By default, web servers default to the index. html file in the directory, so it will show the Swagger UI file automatically.

What is the URL for Swagger UI?

By default, Swagger UI is accessible at /q/swagger-ui . The value / is not allowed as it blocks the application from serving anything else. A value prefixed with '/' makes it absolute and not relative. Once your application is started, you can go to http://localhost:8080/q/swagger-ui and play with your API.


2 Answers

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.

like image 95
Smajl Avatar answered Oct 04 '22 23:10

Smajl


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.

like image 38
nijogeorgep Avatar answered Oct 04 '22 23:10

nijogeorgep