Pertanyaan Jackson @JsonProperty (required = true) tidak memberikan pengecualian


Saya menggunakan jackson 2.2 annotation @JsonProperty dengan set ke true yang diperlukan. Sementara desierializing file json yang tidak mengandung properti itu melalui metode ObjectMapper readValue () tidak terkecuali sedang dilemparkan. Apakah seharusnya bekerja dengan cara yang berbeda atau apakah saya melewatkan sesuatu?

Kelas dto saya:

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

Beginilah cara saya mendesentralisasikan kelas:

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

Ini adalah bagaimana sebenarnya disebut:

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

Actuall json terlihat seperti:

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

Saya berharap bahwa sejak _name tidak ditentukan dalam file json dan diperlukan bahwa pengecualian akan dibuang.


32
2017-08-19 18:37


asal


Jawaban:


Sesuai dengan anotasi Jackson javadocs: "Perhatikan bahwa pada 2.0, properti ini TIDAK digunakan oleh BeanDeserializer: dukungan diharapkan akan ditambahkan untuk versi minor nanti."

Yaitu: tidak ada validasi yang dilakukan menggunakan pengaturan ini. Hanya (saat ini) digunakan untuk menghasilkan JSON Schema, atau dengan kode khusus.


21
2017-08-19 23:58



Dengan Jackson 2.6 Anda dapat menggunakan diperlukan, namun Anda harus melakukannya menggunakan JsonCreator

Sebagai contoh:

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

Jika x atau y tidak ada pengecualian akan dilemparkan ketika mencoba deserialize itu.


12
2018-06-17 18:11