Jackson 无法识别基类字段。

huangapple go评论75阅读模式
英文:

Jackson unable to recognise base class fields

问题

I have translated the code snippet for you:

我有以下的父类

```java
@Builder
@Jacksonized
@EqualsAndHashCode
@ToString
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
@NoArgsConstructor
@JsonTypeInfo(use = DEDUCTION)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Child.class, name = "Child")
}
)
public class Parent implements Serializable {

    private static final long serialVersionUID = 6223930820946596247L;

    @JsonProperty("recipient")
    protected Recipient recipient;
    
    .....
}

子类如下

@Builder(builderMethodName = "childRequestBuilder")
@Jacksonized
@EqualsAndHashCode
@ToString
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Child extends Parent implements Serializable {

    private static final long serialVersionUID = -2848064640409441165L;

    @JsonProperty("use_case")
    private String useCase;
}

我正在尝试运行以下测试以检查反序列化。但是,这会引发以下错误

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
未识别的字段 "recipient"(类 a.b.Child$ChildRequestBuilder),
未标记为可忽略的字段(已知属性: "use_case")在 [Source:
(String) "{"recipient":{"endpoint_details":{"someToken":"someToken","someDevice":"someDevice","someApp":"someApp"}}}";
行: 1, 列: 129](通过引用链:
a.b.Child$ChildRequestBuilder["recipient"])

@Test
public void testChildDeserialization() throws JsonProcessingException {
    SomeEndPoint endPoint = SomeEndpoint.builder().someToken("someToken").someDevice("someDevice").someApp("someApp").build();
    Recipient recipient = Recipient.builder().endpointDetails(endPoint).build();
    Child child = Child.childRequestBuilder().build();
    child.setRecipient(recipient);
    String request = new ObjectMapper().writeValueAsString(child);
    Child deserializedChild = new ObjectMapper().readValue(request, Child.class);
    SomeEndPoint someEndPoint = (SomeEndPoint) deserializedChild.getRecipient().getEndpointDetails();
    Assert.assertEquals(someEndPoint.getSomeToken(), endPoint.getSomeToken());
}

希望这对您有所帮助。

英文:

I have the following Parent class

@Builder
@Jacksonized
@EqualsAndHashCode
@ToString
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
@NoArgsConstructor
@JsonTypeInfo(use = DEDUCTION)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Child.class, name = "Child")
}
)
public class Parent implements Serializable {

    private static final long serialVersionUID = 6223930820946596247L;

    @JsonProperty("recipient")
    protected Recipient recipient;
    
    .....
}

The Child class is as follows

@Builder(builderMethodName = "childRequestBuilder")
@Jacksonized
@EqualsAndHashCode
@ToString
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Child extends Parent implements Serializable {

    private static final long serialVersionUID = -2848064640409441165L;

    @JsonProperty("use_case")
    private String useCase;
}

I am trying to run the following test to check deserialisation. However, this throws the following error

> com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
> Unrecognized field "recipient" (class a.b.Child$ChildRequestBuilder),
> not marked as ignorable (1 known properties: "use_case"]) at [Source:
> (String)"{"recipient":{"endpoint_details":{"someToken":"someToken","someDevice":"someDevice","someApp":"someApp"}}}";
> line: 1, column: 129] (through reference chain:
> a.b.Child$ChildRequestBuilder["recipient"])

@Test
    public void testChildDeserialization() throws JsonProcessingException {
        SomeEndPoint endPoint = SomeEndpoint.builder().someToken("someToken").someDevice("someDevice").someApp("someApp").build();
        Recipient recipient = Recipient.builder().endpointDetails(endPoint).build();
        Child child = Child.childRequestBuilder().build();
        child.setRecipient(recipient);
        String request = new ObjectMapper().writeValueAsString(child);
        Child deserialisedChild = new ObjectMapper().readValue(request, Child.class);
        SomeEndPoint someEndPoint = (SomeEndPoint) deserialisedChild.getRecipient().getEndpointDetails();
        Assert.assertEquals(someEndPoint.getSomeToken(), endPoint.getSomeToken());
    }

答案1

得分: 0

我发现 Lombok 注解 @Jacksonized 是罪魁祸首。移除它解决了问题。简单来说,@Jacksonized 干扰了 Jackson 反序列化的方式,通过覆盖一些东西。它会自动配置生成的构建器类供 Jackson 反序列化使用。

英文:

I figured that the Lombok annotation @Jacksonized was the culprit here. Removing it solved the issue. To over-simplify, @Jacksonized interferes with how Jackson does deserialization by overriding a few things. It automatically configures the generated builder class to be used by Jackson's deserialization.

huangapple
  • 本文由 发表于 2023年5月25日 23:19:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/76333900.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定