如果字段不存在
问题描述:
我有一个像如果字段不存在
class Pojo {
private String string;
public String getString() { return string; }
@JsonSetter(nulls = Nulls.FAIL)
public void setString(String string) {
this.string = string;
}
}
我想使反序列化时,如果string
场null
或缺席杰克逊失败一个POJO杰克逊失败反序列化。 (即{"string":null}
或{}
)
正如您所看到的,我已经成功实现了带有JsonSetter注释的第一个目标。我现在所希望的是类似的东西,但对于一个缺失的财产。我发现了其他一些问题,提出了类似的问题,但它们相当古老,并且可能会在将来实施。随着最近发布的杰克逊2.9,我希望现在可能这是可能的。
答
@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
如果适合你的设计更好。
答
您可以通过使用@NotNull
注释感兴趣的字段来执行bean验证。 您可以从设置者中删除注释。
class Pojo {
@NotNull
private String string;
public String getString() { return string; }
public void setString(String string) {
this.string = string;
}
}
同样,如果你想失败,如大小,图案等其他约束验证,你可以使用类似的等价注释available here。