swagger is adding context root twice

Viewed 2859

I am using swagger 3.0.0-SNAPSHOT with my spring-data-rest. I have context configure in my application property file

server.servlet.context-path=/sample/

my swagger configuration is as follows:

@Configuration
@EnableSwagger2WebMvc
@Import({springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration.class})
public class SwaggerConfig {
    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

I am accessing my swagger ui as http://localhost:8080/sample/swagger-ui.html

all end point in swagger appear like

http://locahost:8080/sample/sample/getHello

http://locahost:8080/sample/sample/getName

http://locahost:8080/sample/sample/getAge

these urls should be

http://locahost:8080/sample/getHello

http://locahost:8080/sample/getName

http://locahost:8080/sample/getAge

How do I avoid swagger to add extra context root to endpoint

My RestController looks like

 @RestController
public class HelloController {
    @RequestMapping("/hello")
    public String getHello(){
        return "Hello";
    }

    @RequestMapping("/name")
    public String getName(){
        return "Sample Name";
    }

    @RequestMapping("/age")
    public Integer getAge(){
        return 37;
    }
}

I have confirmed with a sample project that it is happening in every case

1 Answers

When we migrate to swagger 3.0.0-SNAPSHOT, it's include context path also in base path. So, we can remove it by using anonymous implementation of PathProvider. I am able to manage swagger work with the below simple configuration.

import io.swagger.annotations.Api;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.PathProvider;
import springfox.documentation.builders.ApiInfoBuilder;
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.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;


@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig extends WebMvcConfigurationSupport {

    private static final String DESCRIPTION = "My application description";

    private static final String TITLE = " My service title";

    private static final String API_VERSION = "1.0";

    @Value("${server.servlet.context-path}")
    private String contextPath;

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title(TITLE).description(DESCRIPTION).version(API_VERSION).build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).pathProvider(new PathProvider() {
            @Override
            public String getOperationPath(String operationPath) {
                return operationPath.replace(contextPath, StringUtils.EMPTY);
            }

            @Override
            public String getResourceListingPath(String groupName, String apiDeclaration) {
                return null;
            }
        }).select().apis(RequestHandlerSelectors.withClassAnnotation(Api.class)).build().apiInfo(apiInfo());
    }

    @Bean
    public UiConfiguration uiConfig() {
        return UiConfigurationBuilder.builder().displayRequestDuration(true).validatorUrl(StringUtils.EMPTY).build();
    }
}
Related