How to generate Swagger codegen Java models as JPA Entities(如何将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 } }
}
}
这篇关于如何将Swagger代码生成Java模型生成为JPA实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将Swagger代码生成Java模型生成为JPA实体
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01