spring-boot - swagger 两次添加上下文根

标签 spring-boot swagger

我在 spring-data-rest 中使用 swagger 3.0.0-SNAPSHOT。我的应用程序属性文件中有上下文配置

server.servlet.context-path=/sample/

我的swagger配置如下:

@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();
    }
}

我正在访问我的 swagger ui 作为 http://localhost:8080/sample/swagger-ui.html

swagger 中的所有端点看起来像

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

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

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

这些网址应该是

http://locahost:8080/sample/getHello

http://locahost:8080/sample/getName

http://locahost:8080/sample/getAge

如何避免 Swagger 向端点添加额外的上下文根

我的 RestController 看起来像

 @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;
    }
}

我已经通过示例项目确认它在每种情况下都会发生

最佳答案

当我们迁移到 swagger 3.0.0-SNAPSHOT 时,它也在基本路径中包含上下文路径。因此,我们可以使用 PathProvider 的匿名实现来删除它。我能够通过以下简单配置管理 swagger 工作。

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();
    }
}

关于spring-boot - swagger 两次添加上下文根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61778286/

相关文章:

java - 使用spring boot的json输出中的日期格式

java - 为 Java LocalDateTime 生成正确的 swagger 规范

spring-boot - Spring Boot OpenAPI 3 - 如何传递分页详细信息?

api - 在 openAPI 方面,有没有集中的方法来限制 api 暴露给 swagger ui?

java - Spring Boot 属性注入(inject)失败

java - 保存单向一对多映射时,Hibernate 在外键字段中插入空值

javascript - Thymeleaf:将文字与变量结合起来

spring-mvc - 如何对 Spring Controller Advice 进行集成测试

java - swagger-ui 使用 Controller 的接口(interface)和实现复制端点

java - Swagger - Controller 未包含在 OpenApi 文档中