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

我正在使用swagger codegen创建要在Spring睡觉服务器中使用的JAVA模型,我想知道如何让Swagger将每个模型声明为JPA实体。

我用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自动将这些生成的类公开为睡觉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> {
}

解决方案

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

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

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

  • 对于包含ID字段的所有Java文件
    • 在包声明后包含javax.persistence.*的导入语句
    • 在类定义前添加@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
import javax.persistence.*;" : line }
            filter { line -> line.contains('public class') ? "@Entity
$line" : line }
            filter { line -> line.contains('private Long id') ? "@Id
@GeneratedValue(strategy=GenerationType.AUTO)
$line" : line }        }
    }
}

相关文章