@JsonUnwrapped禁用杰克逊的fail_on_unknown属性



我试图写一个简单的类,将验证JSON输入字符串,如果它可以转换为目标JAVA对象。如果在输入JSON字符串中发现任何未知字段,则验证器应该失败。这一切都像预期的那样工作,除非我用@JsonUnwrapped注释了A类中的B对象,然后对象映射器将静默地忽略未知属性而不会失败。

下面是我的代码:

A类:

public class A implements Serializable{

protected String id;
protected String name;

protected @JsonUnwrapped B b;
public A(){
}
public A(String id, String name, B b) {
    super();
    this.id = id;
    this.name = name;
    this.b = b;
}
     //GETTERS/SETTERS
}

B类:

  public class B {

protected String innerId;
protected String innerName;
public B(){
}
public B(String innerId, String innerName) {
    super();
    this.innerId = innerId;
    this.innerName= innerName;
}
    //GETTERS/SETTERS
 }

验证器类

 public class JsonValidator{
         public boolean validate(){
             ObjectMapper mapper = new ObjectMapper();
        //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
        try {
                mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        A a = mapper.readValue(
                          JsonValidatorBean.class.getResourceAsStream("sample.json"),
                          A.class);
                 } catch (JsonParseException e) {
            e.printStackTrace();
         } catch (JsonMappingException e) {
                e.printStackTrace();
         } catch (IOException e) {
               e.printStackTrace();
         }
}

JSON来验证:

{
   "id": "aaaa",
   "naome": "aaa",    
   "innerId" : "bbbb",
   "innerName" : "bbb"

}

我用的是Jackson 2.1我希望这段代码在未知属性" name "上失败,但它没有,它只是被忽略。如果我删除@JsonUnwrapped并调整Json以具有嵌入对象,则上述代码如预期的那样失败。

任何想法?

是的,这是正确的陈述。由于逻辑需要从父上下文向下传递未包装的属性,因此无法有效地验证哪些属性可以合法地映射到子pojo(正在取消包装的属性),哪些属性不能。

有一个RFE试图改进,以捕获不可映射的属性,但当前版本(直到并包括2.2)不能同时执行unwrapped和防止不可映射的属性。

相关内容

最新更新