我有一个这样的课:
public class Person {
private String name;
public String getName(){
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用像这样配置的ObjectMapper:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)
我有一个str包含它的字符串{ "address" : "something" }.请注意,json中没有"name"字段.如果我做这样的事情:
mapper.readValue(str, Person.class);
Run Code Online (Sandbox Code Playgroud)
然后我实际上得到一个名字设置为null的Person对象.有没有办法配置映射器来抛出异常,或者返回空引用而不是Person?我希望杰克逊认为缺少字段失败,并且不希望对结果对象的字段进行显式空值检查.
zop*_*eux 27
从Jackson 2.6开始,有一种方法,但它不适用于类属性注释,只有构造函数注释:
/* DOES *NOT* THROW IF bar MISSING */
public class Foo {
@JsonProperty(value = "bar", required = true)
public int bar;
}
/* DOES THROW IF bar MISSING */
public class Foo {
public int bar;
@JsonCreator
public Foo(@JsonProperty(value = "bar", required = true) int bar) {
this.bar = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,杰克逊目前不支持这一点。
解决方案可能是在构造函数中添加验证。理想情况下,如果您不想将这些值序列化为 null ,则意味着您根本不应该将它们设置为 null (以其他方式构造)。例如,
public class Person {
private String name;
public Person() {
checkNotNull(name);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这可能并不适合所有情况,特别是如果您使用对象而不是通过序列化/反序列化。
尽管它们在注释required中具有属性@JsonProperty,但在反序列化期间根本不支持它,并且仅为了装饰 JSON 模式而引入。看这个主题
| 归档时间: |
|
| 查看次数: |
17086 次 |
| 最近记录: |