2013-08-19 107 views
25

jackson 2.2アノテーション@JsonPropertyを使用していますが、必須のtrueを設定しています。 ObjectMapper readValue()メソッドを介してそのプロパティを含まないjsonファイルを非直列化している間に、例外はスローされません。 それは別の方法で動作するはずですか、または私は何かを逃しましたか? Jackson @JsonProperty(required = true)は例外をスローしません

私のDTOクラス:

public class User { 
    public enum Gender {MALE, FEMALE} 

    ; 

    public static class Name { 
     private String _first, _last; 

     public String getFirst() { 
      return _first; 
     } 

     public String getLast() { 
      return _last; 
     } 

     public void setFirst(String s) { 
      _first = s; 
     } 

     public void setLast(String s) { 
      _last = s; 
     } 
    } 

    private Gender _gender; 
    private Name _name; 
    private boolean _isVerified; 
    private byte[] _userImage; 

    @JsonProperty(value ="NAAME",required = true) 
    public Name getName() { 
     return _name; 
    } 

    @JsonProperty("VERIFIED") 
    public boolean isVerified() { 
     return _isVerified; 
    } 

    @JsonProperty("GENDER") 
    public Gender getGender() { 
     return _gender; 
    } 
    @JsonProperty("IMG") 
    public byte[] getUserImage() { 
     return _userImage; 
    } 

    @JsonProperty(value ="NAAME",required = true) 
    public void setName(Name n) { 
     _name = n; 
    } 
    @JsonProperty("VERIFIED") 
    public void setVerified(boolean b) { 
     _isVerified = b; 
    } 
    @JsonProperty("GENDER") 
    public void setGender(Gender g) { 
     _gender = g; 
    } 
    @JsonProperty("IMG") 
    public void setUserImage(byte[] b) { 
     _userImage = b; 
    } 
} 

これは私がクラスをデシリアライズ行う方法です:

Serializer serializer = new Serializer(); 
    User result = serializer.readUser(new File("user.json")); 

Actuall JSONは次のようになります。

public class Serializer { 
    private ObjectMapper mapper; 

    public Serializer() { 
     mapper = new ObjectMapper(); 
     SimpleModule sm = new SimpleModule("PIF deserialization"); 
     mapper.registerModule(sm); 
    } 

    public void writeUser(File filename, User user) throws IOException { 
     mapper.writeValue(filename, user); 
    } 

    public User readUser(File filename) throws IOException { 
      return mapper.readValue(filename, User.class); 
     } 
} 

これは、それが実際に呼び出される方法です:

{"GENDER":"FEMALE","VERIFIED":true,"IMG":"AQ8="} 

jsonファイルで_nameが指定されていないため、例外がスローされる必要があります。

答えて

15

javadocs: "2.0以降、このプロパティはBeanDeserializerによって使用されないことに注意してください。サポートは後のマイナーバージョンに追加される予定です。"

つまり、この設定を使用して検証は実行されません。これは、(現在)JSONスキーマを生成するため、またはカスタムコードによってのみ使用されます。

必要な、しかし、あなたは、例えばJsonCreator

を使用してそれをしなければならない使用することができジャクソン2.6で

+0

妥当性確認の目的でスキーマv.4を生成する最良の方法は何ですか? – jaksky

+0

ObjectMapperマッパー=新規ObjectMapper(); JsonSchemaスキーマ= mapper.generateJsonSchema(User.class); スキーマをこのように生成すると、検証無効なスキーマ中に主張されます – jaksky

+0

別の質問をすることをお勧めします。 Jacksonでは、外部モジュール(https://github.com/FasterXML/jackson-module-jsonSchema)を使用します。しかし、他のJSON Schemaジェネレータもあります。私はJSON Schemaを何かのために自分で使用しないので、どちらが最善であるかについて私はコメントできません。 – StaxMan

10

public class MyClass { 

    @JsonCreator 
    public MyClass(@JsonProperty(value = "x", required = true) Integer x, @JsonProperty(value = "value_y", required = true) Integer y) { 
     this.x = x; 
     this.y = y; 
    } 

    private Integer x; 
    private Integer y; 
} 

xまたはyがデシリアライズしようとしたときに例外がスローされます存在しない場合それ。

+1

しかし、(どんなレートであれ、Jackson 2.6.5の場合)、JSONがxを "null"に割り当てると、Jacksonはこれをうれしく有効とみなします。 – fragorl

-3

@JsonPropertyの代わりに@NotNullを使用します。 100%動作し、MethodArgumentNotValidExceptionをスローします。

@NotNull 
    @JsonProperty("property") 
    private String prop; 

Hereより多くのオプションのためのリンクです。

+5

私の場合はうまくいかなかった –

関連する問題