所以我正在开发一个 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操作系统是否无法正确读取该路径中的文件。根据其他帖子,我已经尝试过不同的网址,例如以下网址,但它们对我不起作用。
注意**
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 也很陌生。我很乐意阅读可以帮助我解决此问题的内容。不是在寻找现成的解决方案,但我已经尝试了多个论坛中几乎所有相关的解决方案,因此发布该帖子,因为我仍然无法找到此问题的根本原因。另外,我无法更改现有的实现(比如从头开始编写),因此我在这里更多地了解根本原因。
问题: 无法调用“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>
我只是在 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 是:
希望有帮助;-)