Java 如果字段不存在,则反序列化失败
我有一个像pojo一样的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在
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;
}
}
类似地,如果希望验证其他约束(如大小、模式等)失败,可以使用类似的等效注释