繁体   English   中英

如何生成 Swagger codegen Java 模型作为 JPA 实体

[英]How to generate Swagger codegen Java models as JPA Entities

我正在使用 Swagger codegen 创建 Java 模型,用于 Spring REST 服务器,并想知道如何获取 Swagger 以将每个 model 声明为 model 实体.79588249

我使用swagger-codegen-maven-plugin生成代码如下:

<plugin>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>2.4.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/openApi/Rack.json</inputSpec>
                <language>spring</language>
                <groupId>com.me</groupId>
                <artifactId>rest-server</artifactId>
                <apiPackage>com.me.rest.api</apiPackage>
                <modelPackage>com.me.rest.model</modelPackage>
                <invokerPackage>com.me.rest.invoker</invokerPackage>
                <configOptions>
                    <sourceFolder>src/gen/java/main</sourceFolder>
                    <java8>true</java8>
                    <dateLibrary>java8</dateLibrary>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

正如我现在所拥有的,这是生成的缩写 java 代码:

@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "...")

public class Rack   {
  @JsonProperty("id")
  private Long id = null;

  @JsonProperty("name")
  private String name = null;

  ...
}

如何获取 Swagger 添加 @Entity 和 @Id JPA 注释,如下所示?

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "...")

public class Rack   {
  @Id
  @JsonProperty("id")
  private Long id = null;

  @JsonProperty("name")
  private String name = null;

  ...
}

这样,为了让 Spring 自动将这些生成的类公开为 REST API,我所要做的就是将以下内容添加到我的pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

然后我可以用 Spring-Data 创建 JPA 存储库,如下所示:

public interface RackRepository extends CrudRepository<Rack, Long> {
}

最近合并了一个 PR 来解决您的问题: https://github.com/OpenAPITools/openapi-generator/pull/11775

您需要升级您的Maven插件才能使用最新版本(目前未发布,只有快照可用)

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>6.0.0-SNAPSHOT</version>
    ...
</plugin>

配置可能略有不同。

然后你需要在你的规范中添加 x-class-extra-annotation 和 x-field-extra-annotation。

例如宠物诊所:

  schemas:
    Pet:
      type: object
      x-class-extra-annotation: "@javax.persistence.Entity"
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
          x-field-extra-annotation: "@javax.persistence.Id"
        name:
          type: string
        tag:
          type: string

虽然解决这个问题的正确方法肯定是 swagger-codegen 的扩展(可能是引入了某种包含/排除配置),但我对生成的文件进行了相当简单的后处理。

与 OP 相比,我使用Gradle而不是Maven并利用其扩展的过滤功能。 对于 Maven,可能需要通过 Groovy-Maven-Plugin 运行 Groovy 脚本,因为 Maven 仅支持占位符替换(与 Ant 一样,因此使用 AntRun-Plugin 也不起作用)。

我使用了一个简单的启发式方法来只包含带有 id 的实体 - 逻辑如下:

  • 对于包含 ID 字段的所有 Java 文件
    • 在包声明之后包含javax.persistence.*导入语句
    • 在类定义之前添加@Entity -annotation
    • 对于 ID 字段,添加注释@Id@GeneratedValue
    • (基于字段名称,其他注释 - @OneToMany等 - 也可以添加)

Gradle 用户可能会发现以下任务作为开始很有用:

task generateJpaAnnotations(type: Copy) {
    from "${swaggerSources.<modelName>.code.outputDir}/src/main/java"
    into "<output dir>
    include '**/*.java'

    eachFile {
        if (it.file.text.contains("private Long id")) {
            filter { line -> line.contains('package') ? "$line\nimport javax.persistence.*;" : line }
            filter { line -> line.contains('public class') ? "@Entity\n$line" : line }
            filter { line -> line.contains('private Long id') ? "@Id\n@GeneratedValue(strategy=GenerationType.AUTO)\n$line" : line }        }
    }
}

所以我实际上也在问自己同样的问题。 我找到了一个例子,但这个人只是重新定义了他的 POJO 并提供了一种方法来使生成的 POJO 适应手写的 POJO。 乏味而不是进化。

在全球范围内,这可能很难,因为我不确定您的招摇有没有办法决定哪个 POJO 将启用 JPA,也许您不希望它们都在您的数据库中(?)此外,您如何标记 id昂首阔步? 如果您知道这种方式,您可以随时修改小胡子(我猜是 pojo.mustache)以提供您缺少的注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM