2012-07-06 7 views
5

を使用してJSONをデコードする際の検証は、私は、JSONエンコードされた文字列を受け取り、その後、私はこのように、POJOにそれを解読:ジャクソン

String json = ... 

final ObjectMapper mapper = new ObjectMapper(); 
MyPojo obj = mapper.readValue(json, MyPojo.class); 

私は、この入力を検証することができるようにしたいが、私はよく分かりませんそれを行う "正しい方法"は何ですか?

@JsonIgnoreProperties(ignoreUnknown=true) 
class MyPojo { 
    public static enum Type { 
     One, 
     Two, 
     Three; 

     @JsonValue 
     public String value() { 
      return this.name().toLowerCase(); 
     } 
    } 

    private String id; 
    private Type type; 
    private String name; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Type getType() { 
     return this.type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

私が検証する三つのことがあります:

  1. すべてのメンバーが列挙型の値が列挙
  2. の一部であることを値
  3. を持っていることが
    のはMyPojoは、このように定義されているとしましょう
  4. いくつかの基準(つまり、最小または最大の長さ、最小または人数の値、正規表現など)に対する一部またはすべての値をテストします。

検証が失敗した場合は、わかりやすく読みやすいメッセージを返したいと思います。

第1および第3の問題については、オブジェクトのすべてのメンバーをチェックしてヌルであるかどうかを確認し、基準に照らしてテストしないと、このアプローチは長くなり複雑になることがあります。

第二の問題については、入力の値が列挙値のいずれかと一致しない場合は、JsonMappingExceptionがスローされ、私はこれを行うために管理:

try { 
    MyPojo obj = mapper.readValue(json, MyPojo.class); 
} 
catch (JsonMappingException e) { 
    return "invalid value for property: " + e.getPath().get(0).getFieldName(); 
} 

しかし、どのように、私は入手できますか私が返すことができるように入力の値:invalid value: VALUE for property: PROPERTY

ありがとうございました。

答えて

1

JSR-303 Bean Validationの実装を使用することをおすすめします。この仕様では、ドメイン上で検証したい制約を指定するための注釈とXML設定ファイルのセットを定義しています。リファレンス実装では、ここに提供されています:

+1

おかげで、これは面白そうだと私はそれをチェックアウトしますが、それは私が探していたものを正確にはありません...私はジャクソンありますかしら私が投稿した最初の2つの問題を少なくとも検証する方法。 –