我有一个类似的幽灵
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,我希望现在可能这样做。
答案 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。