jaksky jaksky - 22 days ago 7
Java Question

Jackson @JsonProperty(required=true) doesn't throw an exception

I am using jackson 2.2 annotation @JsonProperty with required set to true. While deserializing json file which doesn't contain that property via ObjectMapper readValue() method no exception is being thrown.
Is it supposed to work in a different way or did I missed something?

My dto class:

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


This is how do I deserialize the class:

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


This is how it is actually called:

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


Actuall json looks like:

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


I would expect that since _name is not specified in json file and is required that the exception will be thrown.

Answer

As per Jackson annotations javadocs: "Note that as of 2.0, this property is NOT used by BeanDeserializer: support is expected to be added for a later minor version."

That is: no validation is performed using this settings. It is only (currently) used for generating JSON Schema, or by custom code.