如何让杰克逊忽略构造函数属性

时间:2018-11-12 12:10:00

标签: java jackson lombok

我正在尝试让Jackson进行反序列化

{
    "test": 2018
}

SomeJavaClass:
 private final Test test

但是我想使用Lombok项目进行Test类。但是,Lombok使用ConstructorProperties注释了该类,由于某种原因,这使杰克逊失败了。

我的课程如下:

@Value
public class SomeJavaClass {
    Test test;
}


@Value
public class Test{
    String value;
}

测试被分解为:

public class Test {
    int value;

    @java.beans.ConstructorProperties({"value"})
    public Test(final int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Test)) {
            return false;
        }
        final Test other = (Test) o;
        if (this.getValue() != other.getValue()) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        result = result * PRIME + this.getValue();
        return result;
    }

    public String toString() {
        return "Test(value=" + this.getValue() + ")";
    }
}

是否可能使Jackson忽略某种构造函数属性?

2 个答案:

答案 0 :(得分:1)

我还认为这里的问题不是注解@java.beans.ConstructorProperties({"value"})

根据您的delombok看来,您有一组注释,这些注释将阻止默认构造函数形成。

因此,也许您可​​以通过添加@NoArgsConstructor来摆脱此问题。如果没有默认的构造函数并且没有@JsonCreator,则会出现类似以下错误:

  

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法   构造org.example.spring.jackson.JacksonTest $ TestClass的实例   (尽管至少存在一个创建者):无法从Object反序列化   价值(没有基于委托人或财产的创造者)

答案 1 :(得分:0)

失败的原因不是@ConstructorProperties。实际上,必须使用此批注以使Jackson与Lombok的@AllArgsConstructor一起工作。

这里的问题是JSON中test的值是一个整数,但是您的类结构要求它是一个对象。因此,您必须将test中的字段SomeJavaClass设为int。然后,您也不需要Test类。 (或在value中将test重命名为Test并摆脱SomeJavaClass并反序列化为Test。)