如何从 openapi 生成器编译一个在生成的源文件夹中实现接口的项目?

Posted

技术标签:

【中文标题】如何从 openapi 生成器编译一个在生成的源文件夹中实现接口的项目?【英文标题】:How can I compile a project that implements interfaces in generated sources folder from openapi generator? 【发布时间】:2021-12-09 03:06:13 【问题描述】:

我正在使用 OpenAPI 生成器 maven 插件和 kotlin-spring 生成器来根据规范为我的 API 生成接口。

作为示例,我使用了this blog post 的规范和以下插件配置:

<plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <version>5.1.0</version>
                <executions>
                    <execution>*
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>
                                $project.basedir/src/main/resources/petstore.yml
                            </inputSpec>
                            <generatorName>kotlin-spring</generatorName>
                            <modelNameSuffix>Dto</modelNameSuffix>
                            <configOptions>
                                <basePackage>com.example</basePackage>
                                <apiPackage>com.example.api</apiPackage>
                                <modelPackage>com.example.model</modelPackage>
                                <configPackage>com.example.config</configPackage>
                                <delegatePattern>true</delegatePattern>
                                <interfaceOnly>true</interfaceOnly>
                                <supportingFilesToGenerate>
                                    ApiUtil.kt
                                </supportingFilesToGenerate>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

当我运行mvn clean generate-sources 时,文件会在target/generated-sources/openapi/... 中正确生成。

然后我在 src 文件夹中创建委托的实现,我可以在其中覆盖生成的接口的方法:

package com.example.api

class PetsApiDelegateImpl : PetsApiDelegate 


到目前为止,一切都很好,IntelliJ 也很满意。但是,当我运行 mvn clean compile 时,target 文件夹被删除并按预期重新生成,但我仍然收到错误:

[ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.5.31:compile (compile) on project choreographer: Compilation failure
[ERROR] /path/to/example/src/main/kotlin/com/example/api/PetsApiDelegateImpl.kt:[3,29] Unresolved reference: PetsApiDelegate

换句话说,这些文件是作为mvn clean compile 的一部分生成的,但由于找不到接口,编译仍然失败。

我怎样才能成功编译这个项目?

【问题讨论】:

【参考方案1】:

我们可以通过将编译目标的执行添加到将生成的目录配置为源目录的kotlin-maven-plugin来解决编译失败。

<plugin>
  <groupId>org.jetbrains.kotlin</groupId>
  <artifactId>kotlin-maven-plugin</artifactId>
                
  <executions>
    <execution>
      <id>compile</id>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <sourceDirs>                 
          <sourceDir>$project.build.directory/generated-sources/kotlin/src/main/kotlin</sourceDir>
        </sourceDirs>
      </configuration>
    </execution>
  </executions>
</plugin>

【讨论】:

以上是关于如何从 openapi 生成器编译一个在生成的源文件夹中实现接口的项目?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 编译器如何从 utf8 源文件生成 unicode 字符串文字

Java - 如何直接从 openapi 3.0 规范生成 Swagger UI

如何从 OpenAPI 3.0 yaml 文件生成 JSON 示例?

从 OpenAPI 规范生成 JSDoc

保护生成的源文件

在 Spring Boot 中使用 Gradle 从 Swagger OpenAPI 生成 RestClient 存根