配置Jackson在缺少字段时抛出异常

mus*_*oom 19 jackson

我有一个这样的课:

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)

  • 如果不需要和丢失,它会抛出异常吗? (2认同)
  • 似乎在构造函数之前不需要@JsonCreator。(?) (2认同)

vto*_*tor 6

不幸的是,杰克逊目前不支持这一点。

解决方案可能是在构造函数中添加验证。理想情况下,如果您不想将这些值序列化为 null ,则意味着您根本不应该将它们设置为 null (以其他方式构造)。例如,

public class Person {
  private String name;
  public Person() {
     checkNotNull(name);
  }
} 
Run Code Online (Sandbox Code Playgroud)

然而,这可能并不适合所有情况,特别是如果您使用对象而不是通过序列化/反序列化。

尽管它们在注释required中具有属性@JsonProperty,但在反序列化期间根本不支持它,并且仅为了装饰 JSON 模式而引入。看这个主题