2017-09-30 49 views
0

我有一个像如果字段不存在

class Pojo { 
    private String string; 

    public String getString() { return string; } 

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

我想使反序列化时,如果stringnull或缺席杰克逊失败一个POJO杰克逊失败反序列化。 (即{"string":null}{}

正如您所看到的,我已经成功实现了带有JsonSetter注释的第一个目标。我现在所希望的是类似的东西,但对于一个缺失的财产。我发现了其他一些问题,提出了类似的问题,但它们相当古老,并且可能会在将来实施。随着最近发布的杰克逊2.9,我希望现在可能这是可能的。

回答

1

@JsonProperty具有可用于

确保的属性值的存在在JSON

不幸的是一个required元件,杰克逊目前(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,杰克逊将抛出一个InvalidDefinitionException它包装在构造函数中抛出的IllegalArgumentException

如果该物业不存在,杰克逊会抛出MismatchedInputException,指出财产不见了。

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


有了这个解决方案,你也可以摆脱二传手干脆让现场final如果适合你的设计更好。

0

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

class Pojo { 

    @NotNull 
    private String string; 

    public String getString() { return string; } 

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

} 

同样,如果你想失败,如大小,图案等其他约束验证,你可以使用类似的等价注释available here

相关问题