当前位置: 首页 > 知识库问答 >
问题:

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

孟俊发
2023-03-14

我正在使用Swagger codegen创建用于Spring REST服务器的Java模型,并且想知道如何让Swagger将每个模型声明为JPA实体。

我使用< code > 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> {
}

共有3个答案

况经纬
2023-03-14

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

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

郎弘业
2023-03-14

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

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

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

  • 对于包含ID字段的所有Java文件
    • javax.persistence的include导入语句* 在包声明之后
    • 在类定义之前添加@Entity-注释
    • 对于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 }        }
        }
    }
    

罗茂实
2023-03-14

最近合并了一个 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 类额外注释和 x 字段额外注释。

例如宠物诊所:

  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
 类似资料:
  • 问题内容: 本着与CriteriaQuery关联的类型安全的精神,JPA 2.0还具有一个API,用于支持实体的元模型表示。 是否有人知道此API的完整功能实现(生成元模型,而不是手动创建元模型类)?如果有人也知道在Eclipse中进行设置的步骤,那将是非常棒的(我认为它与设置注释处理器一样简单,但您永远不会知道)。 编辑:偶然发现了HibernateJPA2元模型生成器。但是问题仍然存在,因为我

  • 我想用Java代码生成EMF模型。例如,我想创建一个新的Ecore建模项目,然后构建一个简单的模型,就像很多教程(比如vogella教程)中看到的那样。但我不想用GUI手工完成。我想学习如何使用EMF-Ecore-API用Java代码创建模型。 我试着找关于这个话题的教程。但令我失望的是,我找不到太多关于这个话题的资料。我能找到的唯一东西是一些代码片段,用来按代码加载和修改现有模型。但没有关于创建

  • 问题内容: 我专门在寻找JPA代码生成技术 首先,哪些项目可以生成符合JPA的代码?(例如HibernateTools) 其次,我还想自定义代码生成实用程序,因为它必须符合我们的企业标准。 如果没有,使用反射生成Java代码的所有可用框架有哪些?所以我可以从头开始写。 注意:我使用eclipse生成JPA代码,并反复对其进行重构以使其兼容。 问题答案: 我也很难理解这个问题,但我将尝试改写: 您在

  • 问题内容: 本着与CriteriaQuery关联的类型安全的精神,JPA 2.0还具有一个API,用于支持实体的元模型表示。 是否有人知道此API的完整功能实现(生成元模型,而不是手动创建元模型类)?如果有人也知道在Eclipse中进行设置的步骤,那将是非常棒的(我认为这与设置注释处理器一样简单,但你永远不会知道)。 编辑:偶然发现了Hibernate JPA 2元模型生成器。但是问题仍然存在,因

  • 我正在使用swagger-codgen为我的spring boot应用程序生成java模型类,并将它们序列化为json。默认情况下,这些模型都包含带有空值的可选属性。 我想为spring配置swagger codgen,以便在所有类的顶部包含此注释:,以便在序列化的json中不包含空值属性。 我怎样才能做到这一点?是否有配置选项,或者我必须手动扩展 spring 代码生成?

  • 我正在努力创建rest客户端,我将调用一个API来提供这个大的json输出。我想知道如何通过输入这个json来自动创建Pojo类来晃动代码gen,并让它为我创建我的pojo类,这将节省手动时间。这是我尝试过的 要为生成PHP客户端,请执行以下操作:http://petstore.swagger.io/v2/swagger.json,请运行以下命令: (如果您使用的是Windows,请将最后一个命令