编辑:
我发现了问题:我必须找到一种方法,使庄严的Codegen在生成Java类时删除“ visible = true”部分。如果我手动删除,它的工作原理。问题在于类在编译时生成,并且修改将被覆盖。
Stil需要帮助!
最初的职位:
我有以下几点:
具有列表的Reception实体类。 Checkpoint是基类,但是将仅包含子类,例如Checkpoint1,Checkpoint2等。
一个具有由“ / receptions”映射的HTTP POST方法的ReceptionCotroller。
Swagger CodeGen openapi 3.0.2生成的用于接收和检查点的DTO类(检查点基类,检查点1,检查点2等)。使用yml文件。 Checkpoint DTO具有一个名为“ dtype”的鉴别字段(在yml文件中),因此在将JSON反序列化为Checkpoint时,它知道它所引用的子类。
问题是当我添加属性:spring.jackson.deserialization.fail-on-unknown-properties = true时,它无法识别“ dtype”属性并且失败。我希望应用程序在遇到未知属性时失败,但要忽略“ dtype”。
我试图在Checkpoint DTO中添加一个dtype字段(在鉴别符定义旁边),但是作为响应返回的JSON具有2个dtype字段(一个带有discriminator值,一个带有null值)。
yml文件中的接收和检查点:
Reception:
description: description1
type: object
properties:
id:
type: integer
format: int64
description: Id of the reception.
checkpoints:
type: array
items:
oneOf:
- $ref: '#/components/schemas/Checkpoint1'
- $ref: '#/components/schemas/Checkpoint2'
discriminator:
propertyName: dtype
$ref: '#/components/schemas/Checkpoint'
description: List of checkpoints attached to this reception.
Checkpoint:
description: Checkpoint entity.
type: object
properties:
checkpointId:
type: string
description: description1.
required:
- checkpointId
- dtype
discriminator:
propertyName: dtype
生成的Checkpoint DTO类:
@ApiModel(description = "Checkpoint entity.")
@Validated
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dtype", visible = true )
@JsonSubTypes({
@JsonSubTypes.Type(value = Checkpoint1.class, name = "Checkpoint1"),
@JsonSubTypes.Type(value = Checkpoint2.class, name = "Checkpoint2")
})
public class Checkpoint {
@JsonProperty("dtype")
private String dtype = null;
@JsonProperty("checkpointId")
private String checkpointId = null;
(.....)
Json作为请求正文发送:
{
"id": 123,
"checkpoints": [
{
"dtype": "Checkpoint1",
"checkpointId": "Checkpoint1"
}
}
它说它不识别dtype字段。我希望它创建适当的Checkpoint对象,但忽略Checkpoint DTO在生成的类中实际上不包含dtype字段。我不想让它忽略其他未知属性。例如:如果我在JSON中添加另一个“ fooBar”字段,我希望它失败。
希望所提供的信息可以理解我的问题。如果没有,我可以提供更多信息。
提前谢谢了!!
PS:请忽略最终的语法错误或拼写错误,代码可以正常工作并正确编译,但是我不知道如何仅忽略discriminator(dtype)属性。
最佳答案
有两种方法可以完成此操作。
首先:
如果允许您更改自动生成的Java代码,则可以将注释@JsonIgnoreProperties(value = [“ dtype”])添加到所有具有歧视字段的类中,如下所示。
@JsonIgnoreProperties(value = ["dtype"])
public class Checkpoint {
//your properties here
}
一个示例实现:Use of JsonIgnoreProperties specific property deserialize properties exists only in JSON
问题有一个示例实现
第二:
如果不允许编辑自动生成的Java代码,则可以使用Jackson Mixins忽略特定的不需要的字段。
@JsonIgnoreProperties(value = ["dtype"])
public abstract class CheckpointMixin {}
并在您的对象映射器中为目标类注册此mixin,如下所示:
mapper.addMixIn(Checkpoint::class.java, CheckpointMixin::class.java)
我在Kotlin尝试了一下,效果很好。请忽略任何语法错误。