如果不存在字段,则杰克逊无法反序列化

时间:2017-09-30 15:47:55

标签: java jackson

我有一个类似的幽灵

class Pojo {
    private String string;

    public String getString() { return string; }

    @JsonSetter(nulls = Nulls.FAIL)
    public void setString(String string) {
        this.string = string;
    }
}

如果string字段为null或不存在,我希望在反序列化时使jackson失败。 (即{"string":null}{}

正如您所看到的,我已经使用JsonSetter注释成功实现了第一个目标。我现在所希望的是这样的东西,但是对于一个失踪的财产。我发现了一些其他类似问题的问题,但是它们已经很老了并且可以在将来实现的引用功能。随着最近发布的杰克逊2.9,我希望现在可能这样做。

2 个答案:

答案 0 :(得分:1)

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

  

确保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

如果该财产缺席,杰克逊会抛出一个MismatchedInputException说明遗失了财产。

这两个例外都是JsonMappingException的子类型,因此您可以轻松地以相同的方式处理它们。

使用此解决方案,您还可以完全摆脱setter并创建字段final,如果这更适合您的设计。

答案 1 :(得分:0)

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

class Pojo {

    @NotNull
    private String string;

    public String getString() { return string; }

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

}

同样,如果您想要对其他约束(如大小,模式等)的验证失败,您可以使用类似的等效注释available here