Pregunta Jackson @ JsonProperty (obligatorio = verdadero) no lanza una excepción


Estoy usando la anotación de jackson 2.2 @JsonProperty con el conjunto requerido en verdadero. Mientras se deserializa el archivo json que no contiene esa propiedad mediante el método ObjectMapper readValue (), no se lanza ninguna excepción. ¿Se supone que debe funcionar de una manera diferente o me perdí algo?

Mi clase de 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;
    }
}

Así es como deserializo la clase:

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

Así es como se llama en realidad:

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

Actuall json se ve así:

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

Yo esperaría que dado que _name no está especificado en el archivo json y se requiere que la excepción sea lanzada.


32
2017-08-19 18:37


origen


Respuestas:


Según las anotaciones de Jackson javadocs: "Tenga en cuenta que a partir de 2.0, esta propiedad NO es utilizada por BeanDeserializer: se espera que se agregue soporte para una versión menor posterior".

Es decir: no se realiza ninguna validación utilizando esta configuración. Solo se usa (actualmente) para generar el Esquema JSON o por código personalizado.


21
2017-08-19 23:58



Con Jackson 2.6 puede usar requerido, sin embargo, tiene que hacerlo usando JsonCreator

Por ejemplo:

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

Si x o y no están presentes, se lanzará una excepción cuando intente deserializarlo.


12
2018-06-17 18:11