Pertanyaan Konfigurasikan Jackson untuk melempar pengecualian ketika sebuah bidang hilang


Saya memiliki kelas seperti ini:

public class Person {
  private String name;
  public String getName(){
    return name;
  }
}

Saya menggunakan ObjectMapper yang dikonfigurasi seperti ini:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Saya punya String str yang mengandung ini { "address" : "something" }. Perhatikan bahwa tidak ada kolom "nama" di json. Jika saya melakukan sesuatu seperti ini:

mapper.readValue(str, Person.class);

kemudian saya benar-benar mendapatkan kembali objek Person dengan nama diset ke null. Apakah ada cara untuk mengkonfigurasi mapper untuk melempar pengecualian sebagai gantinya, atau mengembalikan referensi null bukannya Pribadi? Saya ingin Jackson menganggap bidang yang hilang sebagai kegagalan dan tidak ingin melakukan pemeriksaan null eksplisit pada bidang objek yang dihasilkan.


12
2018-02-05 23:15


asal


Jawaban:


Sayangnya ini tidak didukung oleh Jackson saat ini.

Solusi bisa berupa menambahkan validasi di konstruktor Anda. Sebagai idealnya jika Anda tidak ingin memiliki nilai-nilai yang diserialkan sebagai null, itu berarti Anda tidak harus memiliki mereka sebagai null sama sekali (dibangun dengan cara lain). Sebagai contoh,

public class Person {
  private String name;
  public Person() {
     checkNotNull(name);
  }
} 

Namun ini mungkin tidak dapat diaplikasikan di semua situasi, khususnya jika Anda menggunakan objek Anda selain dari serialisasi / deserializing.

Padahal mereka punya required atribut dalam @JsonProperty anotasi, itu tidak didukung selama deserialisasi sama sekali, dan telah diperkenalkan hanya untuk skema JSON dekorasi. Lihat ini tema


3
2018-02-11 09:13



Pada Jackson 2.6, di sana adalah sebuah jalan, tetapi tidak berfungsi hanya pada anotasi atribut kelas anotasi konstruktor:

/* DOES *NOT* THROW IF bar MISSING */
public class Foo {    
    @JsonProperty(value = "bar", required = true)
    public int bar;
}

/* DOES THROW IF bar MISSING */
public class Foo {
    public int bar;
    @JsonCreator
    public Foo(@JsonProperty(value = "bar", required = true) int bar) {
        this.bar = bar;
    }
}

18
2018-01-21 10:47