2013-08-19 4 views
25

jackson 2.2 주석 @JsonProperty를 사용하고 있는데 필수 항목을 true로 설정합니다. ObjectMapper readValue() 메서드를 통해 해당 속성을 포함하지 않는 json 파일을 deserialize하는 동안 예외가 throw되지 않습니다. 다른 방식으로 작동해야합니까, 아니면 놓친 적이 있습니까? Jackson @JsonProperty (필수 = true) 예외를 throw하지 않습니다.

내 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")); 

실제 위치는 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="} 

_name이 json 파일에 지정되지 않았으므로 예외가 발생해야합니다.

답변

15

잭슨 주석에 따라 javadocs : "2.0부터는이 속성을 BeanDeserializer에서 사용하지 않습니다. 지원은 이후의 부 버전에 추가 될 것으로 예상됩니다."

즉 :이 설정을 사용하여 유효성 검사가 수행되지 않습니다. JSON 스키마를 생성하거나 사용자 정의 코드로만 사용됩니다 (현재). 당신이 필요 사용할 수 있습니다 잭슨 2.6

+0

유효성 검사를 위해 스키마 v.4를 생성하는 가장 좋은 방법은 무엇입니까? – jaksky

+0

ObjectMapper 매퍼 = new ObjectMapper(); JsonSchema 스키마 = mapper.generateJsonSchema (User.class); 이 방법으로 스키마를 생성 할 때 유효하지 않은 유효하지 않은 스키마 중에 주장합니다 – jaksky

+0

그것에 대해 별도의 질문을 할 수 있습니다. Jackson을 사용하면 외부 모듈 (https://github.com/FasterXML/jackson-module-jsonSchema)을 사용할 수 있습니다. 하지만 다른 JSON 스키마 생성기가 있습니다. JSON Schema를 직접 사용하지 않으므로 어떤 것이 가장 좋을지 언급 할 수 없습니다. – StaxMan

10

, 그러나 당신은 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

그러나 (어떤 이유로 든 Jackson 2.6.5의 경우) JSON이 x를 "null"로 지정하면 Jackson은이를 행복하게 받아들입니다. – fragorl

-3

@JsonProperty 대신 @NotNull을 사용하십시오. 100 % 작동하고 MethodArgumentNotValidException을 발생시킵니다.

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

Here은 더 많은 옵션을위한 링크입니다.

+5

내 경우에는 작동하지 않았다. –

관련 문제