Java 如果字段不存在,则反序列化失败

Java 如果字段不存在,则反序列化失败,java,jackson,Java,Jackson,我有一个像pojo一样的 class Pojo { private String string; public String getString() { return string; } @JsonSetter(nulls = Nulls.FAIL) public void setString(String string) { this.string = string; } } 如果字符串字段为null或不存在,我想让jackson在

我有一个像pojo一样的

class Pojo {
    private String string;

    public String getString() { return string; }

    @JsonSetter(nulls = Nulls.FAIL)
    public void setString(String string) {
        this.string = string;
    }
}
如果字符串字段为null或不存在,我想让jackson在反序列化时失败。i、 e.{string:null}或{}

正如您所看到的,我已经成功实现了JsonSetter注释的第一个目标。我现在所希望的是,除了一处遗失的房产之外,还有这样的东西。我发现其他一些问题也有类似的问题,但它们都是很老的,并且引用了将来可能实现的功能。随着jackson 2.9的最新发布,我希望这现在可能成为可能。

@JsonProperty有一个可以使用的元素

确保JSON中存在属性值

不幸的是,Jackson目前2.9只支持它与@JsonCreator注释的构造函数或工厂方法一起使用。由于@JsonSetter只适用于setter,因此您必须自己进行null验证

例如,您可以定义一个构造函数,如

@JsonCreator
public Pojo(@JsonProperty(value = "string", required = true) String string) {
    if (string == null) {
        throw new IllegalArgumentException("string cannot be null");
    }
    this.string = string;
}
如果属性存在,但设置为null,Jackson将抛出InvalidDefinitionException,该异常包装构造函数中抛出的IllegalArgumentException

如果属性不存在,Jackson将抛出一个不匹配的PutException,声明属性缺失

这两个异常都是JsonMappingException的子类型,因此可以用相同的方法轻松处理它们


使用此解决方案,您还可以完全摆脱setter,并使字段成为最终字段(如果这更适合您的设计)。

您可以在此处通过使用@NotNull注释感兴趣的字段来执行bean验证。 您可以从setter中删除注释

class Pojo {

    @NotNull
    private String string;

    public String getString() { return string; }

    public void setString(String string) {
        this.string = string;
    }

}
类似地,如果希望验证其他约束(如大小、模式等)失败,可以使用类似的等效注释