Джексон @JsonProperty (required = true) не генерирует исключение
Я использую аннотацию jsonson 2.2 @JsonProperty с требуемым значением true. Хотя десериализация json файла, который не содержит этого свойства с помощью метода ObjectMapper readValue(), не генерируется исключение.
Должен ли он работать по-другому или я что-то пропустил?
Мой класс 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"));
Actuall json выглядит так:
{"GENDER":"FEMALE","VERIFIED":true,"IMG":"AQ8="}
Я бы ожидал, что поскольку _name не указано в json файле и требуется, чтобы исключение было выбрано.
Ответы
Ответ 1
Согласно аннотациям Джексона javadocs: "Обратите внимание, что с версии 2.0 это свойство НЕ используется BeanDeserializer: ожидается, что поддержка будет добавлена для более поздней версии."
То есть: проверка не выполняется с использованием этих настроек. Он используется только (в настоящее время) для создания схемы JSON или с помощью настраиваемого кода.
Ответ 2
С Jackson 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 не присутствуют, при попытке десериализации его будет выбрано исключение.
Ответ 3
Используйте @NotNull вместо @JsonProperty. Он работает на 100% и бросает MethodArgumentNotValidException.
@NotNull
@JsonProperty("property")
private String prop;
Здесь есть ссылка для дополнительных параметров.