如何将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 } }
}
}
相关文章