3

JSON 入力文字列をターゲットJavaオブジェクトに変換できるかどうかを検証する単純なクラスを作成しようとしています。入力 JSON 文字列に不明なフィールドが見つかった場合、バリデータは失敗するはずです。A クラス内の B オブジェクトに @JsonUnwrapped.

これが私のコードです:

クラス 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を使用しています。このコードは不明なプロパティ「naome」で失敗すると予想していますが、無視されるだけではありません。を削除し@JsonUnwrappedて Json を埋め込みオブジェクトに適合させると、上記のコードは期待どおりに失敗します。

何か案は?

4

1 に答える 1

3

はい、これは真実です。親コンテキストからアンラップされたプロパティを渡すために必要なロジックが原因で、どのプロパティが子 POJO (アンラップされているもの) に正当にマップされる可能性があり、どのプロパティがそうでないかを効率的に検証する方法はありません。

物事を改善し、マップできないプロパティをキャッチするための RFE がありますが、現在のバージョン (2.2 まで) は、アンラップとマップできないプロパティに対する保護の両方を行うことができません。

于 2013-04-16T19:08:03.207 に答える