使用 swagger 和 yaml 生成 java 类
Generate java classes using swagger and yaml
我想使用 Maven 插件 swagger-codegen-maven-plugin
版本 2.2.3
生成我的 Java classes。这是我的 pom.xml 配置文件:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.2.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/swagger/project.yaml</inputSpec>
<language>java</language>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
我的 project.yaml 文件包含这个:
definitions:
Parent:
type: "object"
discriminator: "type"
required:
- type
properties:
id:
type: "integer"
format: "int64"
code:
type: "string"
ChildA:
allOf:
- $ref: "#/definitions/Parent"
- properties:
attributeA:
type: "string"
ChildB:
allOf:
- $ref: "#/definitions/Parent"
- properties:
attributeB:
type: "string"
所有 3 个 class 都已生成,然后我想使用 Web 服务创建 ChildA
或 ChildB
。所以我的方法是:
@POST
public Response createChild(@WebParam Parent parent) {
...
}
使用 Postman,我发送了以下 json 以创建一个 ChildA
实例:
{
"code": "child-a",
"attributeA": "value"
}
发生以下异常:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "attributeA" (class io.swagger.client.model.Parent), not marked as ignorable (2 known properties: "code", "id"])
at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@1df2f416; line: 3, column: 17] (through reference chain: io.swagger.client.model.Parent["attributeA"])
我在几个地方读到我需要在 Parent
class 中添加一些注释,例如:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @Type(value = ChildA.class, name = "ChildA"),
@Type(value = ChildB.class, name = "ChildB" ) })
但我不知道如何修改我的 yaml 文件来添加这些注释。有人可以帮助我吗?
我找到了解决方案(不幸的是,这并不是因为 swagger 文档)。在我的 pom.xml 中的插件配置中,缺少 <library>resteasy</library>
。现在的完整配置是:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.2.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/swagger/project.yaml</inputSpec>
<language>java</language>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<library>resteasy</library>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
我想使用 Maven 插件 swagger-codegen-maven-plugin
版本 2.2.3
生成我的 Java classes。这是我的 pom.xml 配置文件:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.2.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/swagger/project.yaml</inputSpec>
<language>java</language>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
我的 project.yaml 文件包含这个:
definitions:
Parent:
type: "object"
discriminator: "type"
required:
- type
properties:
id:
type: "integer"
format: "int64"
code:
type: "string"
ChildA:
allOf:
- $ref: "#/definitions/Parent"
- properties:
attributeA:
type: "string"
ChildB:
allOf:
- $ref: "#/definitions/Parent"
- properties:
attributeB:
type: "string"
所有 3 个 class 都已生成,然后我想使用 Web 服务创建 ChildA
或 ChildB
。所以我的方法是:
@POST
public Response createChild(@WebParam Parent parent) {
...
}
使用 Postman,我发送了以下 json 以创建一个 ChildA
实例:
{
"code": "child-a",
"attributeA": "value"
}
发生以下异常:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "attributeA" (class io.swagger.client.model.Parent), not marked as ignorable (2 known properties: "code", "id"])
at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@1df2f416; line: 3, column: 17] (through reference chain: io.swagger.client.model.Parent["attributeA"])
我在几个地方读到我需要在 Parent
class 中添加一些注释,例如:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @Type(value = ChildA.class, name = "ChildA"),
@Type(value = ChildB.class, name = "ChildB" ) })
但我不知道如何修改我的 yaml 文件来添加这些注释。有人可以帮助我吗?
我找到了解决方案(不幸的是,这并不是因为 swagger 文档)。在我的 pom.xml 中的插件配置中,缺少 <library>resteasy</library>
。现在的完整配置是:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.2.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/swagger/project.yaml</inputSpec>
<language>java</language>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<library>resteasy</library>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>