2013-08-19 68 views
25

Tôi đang sử dụng chú thích jackson 2.2 @JsonProperty với yêu cầu được đặt thành true. Trong khi deserializing tập tin json mà không chứa tài sản đó thông qua ObjectMapper readValue() phương pháp không có ngoại lệ đang được ném. Nó có hoạt động theo một cách khác hoặc tôi đã bỏ lỡ điều gì đó?Jackson @JsonProperty (required = true) không ném ngoại lệ

lớp dto của tôi:

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

Đây là cách để tôi deserialize lớp:

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

Đây là cách nó thực sự được gọi là:

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

actuall json trông giống như :

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

Tôi hy vọng rằng vì _name không được chỉ định trong tệp json và được yêu cầu ngoại lệ sẽ được ném.

Trả lời

15

Theo chú thích của Jackson javadocs: "Lưu ý rằng đến 2.0, thuộc tính này KHÔNG được sử dụng bởi BeanDeserializer: hỗ trợ dự kiến ​​sẽ được thêm vào cho phiên bản nhỏ hơn sau này".

Tức là: không xác thực được thực hiện bằng cài đặt này. Nó chỉ là (hiện tại) được sử dụng để tạo JSON Schema, hoặc bằng mã tùy chỉnh.

+0

Cách tốt nhất để tạo lược đồ v.4 cho mục đích xác thực từ đó là gì? – jaksky

+0

ObjectMapper mapper = new ObjectMapper(); JsonSchema schema = mapper.generateJsonSchema (User.class); Khi tôi tạo lược đồ theo cách này, nó tuyên bố trong lược đồ không hợp lệ hợp lệ – jaksky

+0

Bạn có thể muốn đặt một câu hỏi riêng về điều đó. Với Jackson, bạn sẽ sử dụng mô-đun bên ngoài (https://github.com/FasterXML/jackson-module-jsonSchema). Nhưng có các trình tạo lược đồ JSON khác; Tôi không sử dụng lược đồ JSON cho bất cứ điều gì vì vậy tôi không thể bình luận về cái nào là tốt nhất. – StaxMan

10

Với Jackson 2,6 bạn có thể sử dụng được yêu cầu, tuy nhiên bạn phải làm điều đó bằng JsonCreator

Ví dụ:

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

Nếu x hoặc y không được trình bày một ngoại lệ sẽ được ném khi cố gắng deserialize nó.

+1

Tuy nhiên (đối với Jackson 2.6.5 ở bất kỳ tỷ lệ nào), nếu JSON của bạn gán x thành "null" thì Jackson sẽ vui vẻ chấp nhận điều này là hợp lệ. – fragorl

-3

Sử dụng @NotNull để thay thế cho @JsonProperty. Nó hoạt động 100% và ném MethodArgumentNotValidException.

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

Here là liên kết để có thêm tùy chọn.

+5

Nó không hoạt động trong trường hợp của tôi –