Jackson @JsonProperty (required=true) ne fait pas exception

j'utilise jackson 2.2 annotation @JsonProperty avec required set to true. Alors que la desérialisation du fichier json ne contient pas cette propriété via la méthode ObjectMapper readValue (), aucune exception n'est lancée. C'est censé marcher autrement ou j'ai raté quelque chose?

ma classe 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 je désérialise 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 semble comme:

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

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

33
demandé sur Antti Haapala 2013-08-19 22:37:57

2 réponses

selon Jackson annotations javadoc: "notez qu'à partir de 2.0, Cette propriété n'est plus utilisée par BeanDeserializer: support devrait être ajouté pour une version mineure ultérieure."

C'est-à-dire: aucune validation n'est effectuée avec ces paramètres. Il est seulement (actuellement) utilisé pour générer le schéma JSON, ou par code personnalisé.

22
répondu StaxMan 2013-08-19 23:58:31

avec Jackson 2.6 vous pouvez utiliser required, cependant 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 lancée en essayant de le desérialiser.

14
répondu Bojan Petkovic 2017-08-29 02:41:58