web-dev-qa-db-fra.com

Jackson @JsonProperty (required = true) ne lève pas d'exception

J'utilise l'annotation jackson 2.2 @JsonProperty avec la valeur requise définie sur true. Lors de la désérialisation du fichier json qui ne contient pas cette propriété via la méthode ObjectMapper readValue (), aucune exception n'est levée. Est-il censé fonctionner différemment ou ai-je raté quelque chose?

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

Voici comment désérialiser la classe:

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

Voici comment on l'appelle:

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

Actuall json ressemble à:

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

Je m'attendrais à ce que puisque _name n'est pas spécifié dans le fichier json et qu'il soit nécessaire que l'exception soit levée.

36
jaksky

Selon les annotations de Jackson javadocs : "Notez qu'à partir de 2.0, cette propriété n'est PAS utilisée par BeanDeserializer: le support devrait être ajouté pour une version mineure ultérieure."

Autrement dit: aucune validation n'est effectuée à l'aide de ces paramètres. Il est uniquement (actuellement) utilisé pour générer le schéma JSON, ou par du code personnalisé.

23
StaxMan

Avec Jackson 2.6, vous pouvez utiliser requis, mais vous devez le faire en utilisant JsonCreator

Par exemple:

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 ou y ne sont pas présents, une exception sera levée lors de la tentative de désérialisation.

18
Bojan Petkovic