openapi.yaml 未成功生成 - Swagger Doc 无法在 Windows 计算机上打开

问题描述 投票:0回答:2

所以我正在开发一个 spring-mvc 项目,该项目仅在 Windows 计算机上安装时突然开始出现此问题。这是一个胖客户端应用程序。

尝试访问 swagger 文档时,出现以下错误:

日志在堆栈跟踪中显示以下错误:

2022-04-20 04:15:44.821utc  WARN Configuration,main:117 - couldn't read inflector config from resource stream
2022-04-20 04:15:44.821utc  WARN Configuration,main:131 - couldn't read inflector config from system property
2022-04-20 04:15:44.853utc  WARN OpenAPIV3Parser,main:91 - Exception while reading:
io.swagger.v3.parser.exception.ReadContentException: Unable to read location `openapi.yaml`
    at io.swagger.v3.parser.OpenAPIV3Parser.readContentFromLocation(OpenAPIV3Parser.java:238) ~[swagger-parser-v3-2.0.27.jar:2.0.27]
    at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:87) ~[swagger-parser-v3-2.0.27.jar:2.0.27]

..
..
2022-04-19 17:19:16.980utc ERROR [swagger-inflector],http-nio-8080-exec-8:175 - Allocate exception for servlet [swagger-inflector] 
*java.lang.NullPointerException: Cannot invoke "io.swagger.v3.oas.models.OpenAPI.getComponents()" because "openAPI" is null
at io.swagger.oas.inflector.utils.ExtensionsUtil.removeExtensions(ExtensionsUtil.java:26) ~[swagger-inflector-2.0.6.jar:2.0.6]
at io.swagger.oas.inflector.OpenAPIInflector.getExposedAPI(OpenAPIInflector.java:543) ~[swagger-inflector-2.0.6.jar:2.0.6]*
at io.swagger.oas.inflector.OpenAPIInflector.init(OpenAPIInflector.java:139) ~[swagger-inflector-2.0.6.jar:2.0.6]
at io.swagger.oas.inflector.OpenAPIInflector.<init>(OpenAPIInflector.java:117) ~[swagger-inflector-2.0.6.jar:2.0.6]
at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
at

OpenAPIInflector.getExposeAPI 从 inflector.yaml 文件读取 swaggerURL 位置。由于某些原因,在 Windows 上,配置未拾取 openapi.yaml 文件或相应的 openapi.json 文件,如屏幕截图所示。 xxx-openapi.yaml 是在 inflector.yaml 中定义的内容,据我了解,它用于生成 openapi.yaml 文件。在 MacOs/本地设置中,我可以看到此文件已生成,文档也正常显示。

请帮忙调试一下,可能是什么原因。该工具在类文件夹内为 inflector.yaml 运行的系统上的权限是否正常?

这是 inflector.yaml 的定义方式。

swaggerUrl: xxx-openapi.yaml

xxx-openapi.yaml 和 inflector.yaml 存在于

src/main/resources/

我还想知道Windows操作系统是否无法正确读取该路径中的文件。根据其他帖子,我已经尝试过不同的网址,例如以下网址,但它们对我不起作用。

  1. http://windows-machine-ip:8080/swagger-ui/
  2. http://windows-machine-ip:8080/swagger-ui/index.html
  3. http://windows-machine-ip:8080/v3/api-docs/swagger-ui.html

注意**

openapi:3.0.0

依赖关系:

            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>1.6.5</version>
            </dependency>
            <dependency>
                <groupId>org.openapitools</groupId>
                <artifactId>jackson-databind-nullable</artifactId>
                <version>0.2.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>3.0.0</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-inflector</artifactId>
                <version>2.0.6</version>
            </dependency>

请指导。我是这个项目的新手,对 spring-mvc 也很陌生。我很乐意阅读可以帮助我解决此问题的内容。不是在寻找现成的解决方案,但我已经尝试了多个论坛中几乎所有相关的解决方案,因此发布该帖子,因为我仍然无法找到此问题的根本原因。另外,我无法更改现有的实现(比如从头开始编写),因此我在这里更多地了解根本原因。

spring-mvc swagger swagger-ui springfox inflector
2个回答
0
投票

问题: 无法调用“io.swagger.v3.oas.models.OpenAPI.getExtensions()”,因为“openAPI”为 null

解决方案 如果您不需要rest-api.yml 文件。

添加以下依赖项和插件:

<dependency>
    <groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>
<dependency>
    <groupId>org.openapitools</groupId>
    <artifactId>jackson-databind-nullable</artifactId>
</dependency>


<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>7.0.1</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

-1
投票

我只是在 Spring Core 5.3.18(不是启动)项目上安装 OpenAPI 3 :

1/`<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.7</version>
        </dependency>`  

2/ Configurer :

    
@Configuration
@EnableOpenApi
public class SwaggerConfig {

    private static final Logger log = LoggerFactory.getLogger(SwaggerConfig.class);

    private static String line = "=".repeat(100);

    @Bean
    public Docket api(ServletContext servletContext) {
        log.info(line);
        log.info("Docket swagger called : {} , name :{} ", servletContext.getContextPath(), servletContext.getContext("/rs"));
        log.info(line);
        return new Docket(DocumentationType.OAS_30)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                ;
    }

3/网络配置器:

` 
@Configuration
@EnableWebMvc
public class WebConfigurer implements WebMvcConfigurer {

    private static final Logger log = LoggerFactory.getLogger(WebConfigurer.class);

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

4/ Swagger UI 的 URL 是:

  • [根路径]/v3/api-docs 文档
  • [根路径]/swagger-ui/index.html

希望有帮助;-)

© www.soinside.com 2019 - 2024. All rights reserved.