Saya memiliki kelas model seperti ini, untuk hibernasi
@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String emailId;
private String encryptedPwd;
private String createdBy;
private String updatedBy;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "UserId", unique = true, nullable = false)
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "UserName", length = 100)
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "EmailId", nullable = false, length = 45)
public String getEmailId() {
return this.emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
@Column(name = "EncryptedPwd", length = 100)
public String getEncryptedPwd() {
return this.encryptedPwd;
}
public void setEncryptedPwd(String encryptedPwd) {
this.encryptedPwd = encryptedPwd;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
@Column(name = "UpdatedBy", length = 100)
public String getUpdatedBy() {
return this.updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
}
Di Spring MVC controller, menggunakan DAO, saya bisa mendapatkan objek. dan kembali sebagai Objek JSON.
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable Integer userId) throws Exception {
User user = userService.get(userId);
user.setCreatedBy(null);
user.setUpdatedBy(null);
return user;
}
}
Lihat bagian dilakukan menggunakan AngularJS, sehingga akan mendapatkan JSON seperti ini
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Jika saya tidak ingin menyetel Kata Sandi terenkripsi, saya akan menyetel bidang itu juga sebagai null.
Tetapi saya tidak ingin seperti ini, saya tidak ingin mengirim semua bidang ke sisi klien. Jika saya tidak ingin bidang sandi, diperbarui oleh, dibuat oleh dikirim, hasil saya JSON harus seperti
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
Daftar bidang yang tidak ingin saya kirim ke klien yang berasal dari tabel database lain. Jadi itu akan berubah berdasarkan pengguna yang masuk. Bagaimana saya bisa melakukannya?
Saya harap Anda mendapatkan pertanyaan saya.
sumber
Jawaban:
Tambahkan
@JsonIgnoreProperties("fieldname")
anotasi ke POJO Anda.Atau Anda dapat menggunakan
@JsonIgnore
sebelum nama bidang yang ingin Anda abaikan saat menonaktifkan JSON. Contoh:Contoh GitHub
sumber
@JsonIgnore
adalahcom.fasterxml.jackson.annotation.JsonIgnore
tidakorg.codehaus.jackson.annotate.JsonIgnore
.Saya tahu saya agak terlambat ke pesta, tapi sebenarnya saya mengalami ini juga beberapa bulan yang lalu. Semua solusi yang tersedia tidak terlalu menarik bagi saya (mixin? Ugh!), Jadi saya akhirnya membuat perpustakaan baru untuk membuat proses ini lebih bersih. Tersedia di sini jika ada yang ingin mencobanya: https://github.com/monitorjbl/spring-json-view .
Penggunaan dasarnya cukup sederhana, Anda menggunakan
JsonView
objek dalam metode pengontrol Anda seperti ini:Anda juga dapat menggunakannya di luar Spring:
sumber
Buat kelas tampilan:
Beri keterangan model Anda
Tentukan kelas tampilan di pengontrol Anda
Contoh data:
sumber
Kita dapat melakukan ini dengan menyetel akses ke
JsonProperty.Access.WRITE_ONLY
saat mendeklarasikan properti.sumber
Tambahkan
@JsonInclude(JsonInclude.Include.NON_NULL)
(memaksa Jackson untuk membuat serialisasi nilai null) ke kelas serta@JsonIgnore
bidang sandi.Anda tentu saja dapat mengatur
@JsonIgnore
di createBy dan updatedBy juga jika Anda selalu ingin mengabaikannya dan tidak hanya dalam kasus khusus ini.MEMPERBARUI
Jika Anda tidak ingin menambahkan anotasi ke POJO itu sendiri, pilihan yang bagus adalah Anotasi Mixin Jackson. Lihat dokumentasinya
sumber
Ya, Anda dapat menentukan bidang mana yang diserialkan sebagai respons JSON dan mana yang diabaikan. Inilah yang perlu Anda lakukan untuk mengimplementasikan properti abaikan secara dinamis.
1) Pertama, Anda perlu menambahkan @JsonFilter dari com.fasterxml.jackson.annotation.JsonFilter pada kelas entitas Anda sebagai.
2) Kemudian di controller Anda, Anda harus menambahkan membuat objek MappingJacksonValue dan mengatur filter di atasnya dan pada akhirnya, Anda harus mengembalikan objek ini.
Inilah yang akan Anda dapatkan sebagai tanggapan:
alih-alih ini:
Di sini Anda bisa melihatnya mengabaikan properti lain (bidang3 dalam kasus ini) sebagai respons kecuali untuk properti bidang1 dan bidang2.
Semoga ini membantu.
sumber
Jika saya adalah Anda dan ingin melakukannya, saya tidak akan menggunakan entitas Pengguna saya di lapisan Pengontrol. Sebagai gantinya, saya membuat dan menggunakan UserDto (Objek transfer data) untuk berkomunikasi dengan lapisan bisnis (Layanan) dan Pengontrol. Anda dapat menggunakan Apache BeanUtils (metode copyProperties) untuk menyalin data dari entitas Pengguna ke UserDto.
sumber
Saya telah membuat JsonUtil yang dapat digunakan untuk mengabaikan bidang saat runtime sambil memberikan tanggapan.
Contoh Penggunaan: Argumen pertama harus berupa kelas POJO (Mahasiswa) dan ignoreFields adalah kolom yang dipisahkan koma yang ingin Anda abaikan sebagai respons.
sumber
Saya telah menyelesaikannya hanya dengan menggunakan
@JsonIgnore
seperti yang disarankan @kryger. Jadi pengambil Anda akan menjadi:Anda dapat mengatur
@JsonIgnore
kursus di lapangan, penyetel atau pengambil seperti dijelaskan di sini .Dan, jika Anda ingin melindungi sandi terenkripsi hanya di sisi serialisasi (misalnya, saat Anda perlu masuk ke pengguna Anda), tambahkan
@JsonProperty
anotasi ini ke bidang Anda :Info selengkapnya di sini .
sumber
Saya telah menemukan solusi untuk saya dengan Spring dan jackson
Pertama tentukan nama filter di entitas
Kemudian Anda dapat melihat konstanta filter nama kelas dengan FilterProvider default yang digunakan dalam konfigurasi pegas
Konfigurasi pegas:
Akhirnya saya dapat menentukan filter tertentu di restConstoller ketika saya membutuhkan ....
sumber
Tempatkan
@JsonIgnore
di lapangan atau pengambilnya, atau buat dto kustomatau seperti yang disebutkan di atas dengan
ceekay
memberi anotasi di@JsonProperty
mana atribut akses disetel untuk hanya menulissumber
Bukankah membuat
UserJsonResponse
kelas dan mengisi dengan bidang yang diinginkan menjadi solusi yang lebih bersih?Mengembalikan JSON secara langsung tampaknya merupakan solusi yang bagus ketika Anda ingin mengembalikan semua model. Kalau tidak, itu hanya akan menjadi berantakan.
Di masa mendatang, misalnya Anda mungkin ingin memiliki bidang JSON yang tidak cocok dengan bidang Model apa pun dan kemudian Anda berada dalam masalah yang lebih besar.
sumber
Ini adalah alat utilitas bersih untuk jawaban di atas :
sumber
Di kelas entitas Anda, tambahkan
@JsonInclude(JsonInclude.Include.NON_NULL)
anotasi untuk menyelesaikan masalahitu akan terlihat seperti
sumber