Подтвердить что ты не робот

Джексон @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 файле и требуется, чтобы исключение было выбрано.

4b9b3361

Ответ 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;

Здесь есть ссылка для дополнительных параметров.