2013-08-19 126 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; 
    } 
} 

這是我該如何反序列化類:

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); 
     } 
} 

這是它是如何實際調用:

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

實際工作中JSON的樣子:

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

我認爲,因爲_name沒有在json文件中指定,並且需要拋出異常。

回答

15

根據Jackson註釋javadocs:「請注意,從2.0開始,BeanDeserializer不使用此屬性:預計將爲稍後的次版本添加支持。」

即:使用此設置不執行驗證。它只是(當前)用於生成JSON模式或通過自定義代碼。

+0

什麼是生成模式v.4出於驗證目的的最佳方式? – jaksky

+0

ObjectMapper mapper = new ObjectMapper(); JsonSchema schema = mapper.generateJsonSchema(User.class); 當我通過這種方式生成架構時,它在驗證無效架構期間聲明 – jaksky

+0

您可能想要就此提出一個單獨的問題。與傑克遜,你會使用外部模塊(https://github.com/FasterXML/jackson-module-jsonSchema)。但還有其他的JSON Schema生成器;我不用任何東西來使用JSON Schema,所以我不能評論哪一個最好。 – StaxMan

10

與傑克遜2.6,您可以使用所需的,但是你必須使用JsonCreator

例如,要做到這一點:

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

但是(對於傑克遜2.6.5無論如何),如果你的JSON將x賦值爲「null」,那麼Jackson會高興地接受這個爲有效的。 – fragorl

-3

使用@NotNull代替@JsonProperty。它工作100%並拋出MethodArgumentNotValidException。

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

Here是更多選項的鏈接。

+5

它不適用於我的情況 –