[英]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 的实体 - 逻辑如下:
javax.persistence.*
导入语句@Entity
-annotation@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.