我正在使用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> {
}
所以我实际上在问自己同样的问题。我找到了一个例子,但这家伙只是重新定义了他的POJO,并提供了一种方法,使生成的POJO适应手写的POJOs。沉闷而不进化。
在全球范围内,这可能很难,因为我不确定你是否有办法决定哪个POJO将启用JPA,也许你不希望它们都在你的数据库中(?)此外,如何在昂首阔步中标记id?如果你知道这种方法,你可以随时修改胡子(pojo.mustache我猜)来给你缺少的注释。
虽然解决这个问题的正确方法肯定是swagger-codecen的扩展(可能引入了某种包含/排除配置),但我对生成的文件进行了相当简单的后处理。
与OP相比,我使用Gradle而不是Maven,并利用其扩展的过滤功能。对于Maven来说,可能需要通过Groovy-Maven-Plugin运行Groovy脚本,因为Maven只支持占位符替换(Ant也是如此,所以使用AntRun-Plugin也不起作用)。
我使用了一个简单的启发式方法,只包含带有 id 的实体 - 逻辑如下:
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 } }
}
}
最近合并了一个 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,请将最后一个命令