Saya memiliki kelas entitas dengan bidang kata sandi:
class User {
private String password;
//setter, getter..
}
Saya ingin bidang ini dilewati selama serialisasi. Tapi itu harus tetap bisa melakukan DEserialize. Ini diperlukan, agar klien dapat mengirim saya kata sandi baru, tetapi tidak dapat membaca yang sekarang.
Bagaimana saya melakukannya dengan Jackson?
@JsonIgnore
pada pengambil, tetapi@JsonProperty
pada penyetel, dalam hal ini hal-hal tidak serial, tetapi dapat deserialized.Jawaban:
Anda dapat menandainya sebagai
@JsonIgnore
.Dengan 1.9, Anda dapat menambahkan
@JsonIgnore
untuk getter,@JsonProperty
untuk setter, untuk membuatnya deserialize tetapi tidak serial.sumber
@JsonIgnore
untuk getter,@JsonProperty
untuk setter, untuk membuatnya deserialize tetapi tidak serial.transient
(seperti dalamprivate transient String password;
) tetapi bidang sementara dengan getter publik diabaikan kecuali MapperFeature.PROPAGATE_TRANSIENT_MARKER diaktifkan.Menggambarkan apa yang telah dikatakan StaxMan, ini bekerja untuk saya
sumber
@JsonIgnore
sepertinya tidak perlu di lapangan.Cara mudah adalah dengan membuat anotasi getter dan setter Anda.
Berikut ini adalah contoh asli yang dimodifikasi untuk mengecualikan kata sandi teks biasa, tetapi kemudian menjelaskan metode baru yang hanya mengembalikan bidang kata sandi sebagai teks terenkripsi.
sumber
Dimulai dengan Jackson 2.6 , properti dapat ditandai sebagai hanya baca atau tulis. Ini lebih sederhana daripada meretas anotasi pada kedua pengakses dan menyimpan semua informasi di satu tempat:
sumber
Selain itu
@JsonIgnore
, ada beberapa kemungkinan lain:@JsonIgnoreProperties
di kelas mungkin bergunasumber
transient
adalah solusi untuk saya. Terima kasih! itu asli ke Java dan menghindari Anda untuk menambahkan anotasi khusus kerangka lain.sumber
Orang harus bertanya mengapa Anda menginginkan metode getter publik untuk kata sandi. Hibernate, atau kerangka kerja ORM lainnya, akan dilakukan dengan metode pengambil pribadi. Untuk memeriksa apakah kata sandi itu benar, Anda dapat menggunakan
sumber
Jackson memiliki kelas bernama SimpleBeanPropertyFilter yang membantu memfilter bidang selama serialisasi dan deserialisasi; tidak secara global. Saya pikir itu yang Anda inginkan.
Kemudian dalam kode Anda:
Ini akan mencegah
password
bidang untuk mendapatkan serial. Anda juga akan dapat deserializepassword
bidang seperti itu. Pastikan tidak ada filter yang diterapkan pada objek ObjectMapper.sumber
atur variabel sebagai
@JsonIgnore
Ini memungkinkan variabel untuk dilewati oleh json serializer
sumber