用Jackson进行反序列化(对未知属性失败)不会忽略鉴别符属性(DTO是使用SwaggerCodegen创建的)

时间:2019-07-26 13:42:40

标签: java jackson openapi swagger-codegen

编辑:

我发现了问题:我必须找到一种方法,使庄严的Codegen在生成Java类时删除“ visible = true” 部分。如果我手动删除,它的工作原理。问题在于类在编译时生成,并且修改将被覆盖。

尚需帮助!

初始帖子:

我有以下内容:

  • 具有列表的接收实体类。 Checkpoint是基类,但仅包含Checkpoint1,Checkpoint2等子类。

  • 一个ReceptionCotroller,它具有由“ / receptions”映射的HTTP POST方法。

  • 使用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字段(在discriminator定义旁边),但是作为响应返回的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)属性。

1 个答案:

答案 0 :(得分:0)

有两种方法可以完成此操作。
首先:
如果允许您更改自动生成的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尝试了一下,效果很好。请忽略任何语法错误。