在为 swagger 服务描述呈现路径时如何考虑 servlet 路径映射

How to account for servlet path mapping when rendering paths for swagger service description

我在配置 swagger 时遇到问题。当我在 web.xml 中为 servlet 指定 link 时,例如

<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

swagger 显示 url-s 没有 .../rest/... 所以当我指定 url-pattern 时,我不能使用 swagger-ui 进行测试/* swagger-ui 不起作用。这里是配置 class

@Configuration
@EnableSwagger
public class DocumentationController extends WebMvcConfigurerAdapter {
    private SpringSwaggerConfig springSwaggerConfig;
    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
        this.springSwaggerConfig = springSwaggerConfig;
    }
    @Bean
    public SwaggerSpringMvcPlugin customImplementation() {
        return new SwaggerSpringMvcPlugin(this.springSwaggerConfig).apiInfo(
                apiInfo())
                .genericModelSubstitutes(ResponseEntity.class)
                .includePatterns("/.*");
    }
    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfo("1-st Project's REST API",
                "Write a description of REST API.",
                "link",
                "mail",
                "API License",
                "link");
        return apiInfo;
    }

}

看来您使用的是 2.0.0 之前的 springfox 版本。

这个解决方案有点棘手,而且还没有经过真正的测试,所以不能保证这个工作,但值得一试。

//NOTE: The following code is only an outline to highlight relevant code snippets
@Bean 
public SwaggerSpringMvcPlugin plugin() {
    new SwaggerSpringMvcPlugin(...)
        //more config
        .pathProvider(yourPathProvider());
}

private SwaggerPathProvider yourPathProvider() {
    SwaggerPathProvider pathProvider = new RelativeSwaggerPathProvider(...);
    pathProvider.setApiResourcePrefix("/rest"); //<-- NOTE: this is what you need
    return pathProvider;
}    

现在如果你搬到 2.x 就容易多了。甚至还有一个 document 描述了如何从 1.x 迁移到 2.x。

@Bean 
public Docket plugin() {
    new Docket()
        //more config
        .pathMapping("/rest");

}

另请注意,1.x 没有计划更新。所以迁移到库的 2.0.0 是个好主意。