Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swagger 2 & spring MVC - ignore the war context path

I am using swagger 2 with spring mvc.

The war file is web-app.war and Swagger base URL is shown as /web-app/rest/api

I would like to remove the war context path so the api call can be made as

example.com/rest/api and not example.com/web-app/rest/api

SwaggerConfig.java

@Configuration
@EnableWebMvc
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurerAdapter {

    @Bean
    public Docket api() {
        // @formatter:off
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.any())
                .build().apiInfo(apiInfo());
    }


    private ApiInfo apiInfo() {
         return new ApiInfoBuilder().title("Rest API")
                 .description("Describes the restful interface")
                 .build();
    }

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}
like image 973
Coder Avatar asked Sep 18 '25 21:09

Coder


2 Answers

If /web-app is your context root (you can change it in your IDE, plenty of tutorials online on how to do that) -- then there is no way you can place an element of your project outside that.

To achieve what you want, you could set the context root to / and then prefix your REST services with web-app. This keeps the same REST path, but places the Swagger API at /rest/api.

EDIT

If you believe Springfox has wrongly determined your base path, you can add a PathProvider to the Docket definition:

return new Docket(DocumentationType.SWAGGER_2)
    /*other options*/
    .pathProvider(new PathProvider(){

        String getApplicationBasePath(){
            return "/";
        }
        /*implement other methods or extend RelativePathProvider or Absolute PathProvider instead */
    }
like image 50
Deroude Avatar answered Sep 21 '25 13:09

Deroude


To solve this issue, need to change the host property of the Docket. Otherwise, the basePath will be determined based on the request url (as per Swagger2Controller and how to change base path for swagger)

   @Bean
    public Docket api(ServletContext servletContext) throws LoadPropertiesException {
        String host = "example.com";
        String applicationBasePath = null;
        return new Docket(DocumentationType.SWAGGER_2)
          .groupName("My API").host(host).pathProvider(new RelativePathProvider(servletContext) {
              @Override
              public String getApplicationBasePath() {
                  return applicationBasePath;
              }
          })
          .select()
          .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot"))) .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud"))) .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.data.rest.webmvc")))                       
          .build()
          .apiInfo(apiInfo());                                         
    }
like image 24
Unknown Avatar answered Sep 21 '25 12:09

Unknown