Saya membuat API Istirahat menggunakan Boot Spring dan saya menggunakan Hibernate Validation untuk memvalidasi input permintaan.
Tetapi saya juga memerlukan jenis validasi lain, misalnya ketika data pembaruan perlu diperiksa, jika id perusahaan tidak ada, saya ingin melempar pengecualian khusus.
Haruskah validasi ini ditempatkan di lapisan layanan atau lapisan pengontrol?
Lapisan Layanan:
public Company update(Company entity) {
if (entity.getId() == null || repository.findOne(entity.getId()) == null) {
throw new ResourceNotFoundException("can not update un existence data with id : "
+ entity.getId());
}
return repository.saveAndFlush(entity);
}
Lapisan Pengontrol:
public HttpEntity<CompanyResource> update(@Valid @RequestBody Company companyRequest) {
Company company = companyService.getById(companyRequest.getId());
Precondition.checkDataFound(company,
"Can't not find data with id : " + companyRequest.getId());
// TODO : extract ignore properties to constant
BeanUtils.copyProperties(companyRequest, company, "createdBy", "createdDate",
"updatedBy", "updatedDate", "version", "markForDelete");
Company updatedCompany = companyService.update(company);
CompanyResource companyResource = companyAssembler.toResource(updatedCompany);
return new ResponseEntity<CompanyResource>(companyResource, HttpStatus.OK);
}
sumber
Validasi Hibernate adalah pemeriksaan integritas data. Untuk menghindari RuntimeExceptions dari bbdd. Mereka hampir sama dengan validasi yang harus Anda kontrol dengan Constrains . Karena hanya lapisan bisnis yang seharusnya memberi makan lapisan ketekunan, Anda mungkin (atau tidak, terserah Anda) mempercayai kebenaran data yang berasal dari lapisan bisnis Anda
Saya tidak memasukkan validasi dalam DAO. Saya mengharapkan data yang valid dari lapisan atas. Dalam hal terjadi kesalahan, saya mendelegasikan kepada bbdd tanggung jawab untuk mengetahui isinya.
Kemudian datang validasi di lapisan bisnis. Semua validasi bisnis fokus pada menjaga koherensi data, bukan integritasnya .
Akhirnya saya melakukan validasi sebelumnya pada lapisan kontrol. Yang terkait hanya dengan lapisan tersebut.
Anda akan segera melihat validasi mana yang dimaksudkan untuk diterapkan pada lapisan bisnis. Yang paling umum: kontrol id. Yang ini dapat dengan mudah diimplementasikan di kedua lapisan. Jika Anda berharap memiliki banyak pengontrol atau klien yang menggunakan lapisan bisnis Anda, alih-alih mengulangi validasi yang sama di mana-mana, itu akan menjadi kandidat yang sangat baik untuk ditempatkan di lapisan bisnis.
Kadang-kadang pengendali memiliki aturan dan ketentuan mereka sendiri yang tidak akan direproduksi di fasad lain. Maka itu adalah kandidat untuk dimasukkan ke dalam pengontrol seperti itu.
Pikirkan tentang apa yang Anda validasi dan jika Anda ingin menerapkannya untuk semua orang, apa pun yang terjadi. Atau jika itu adalah validasi kontekstual ("Saya memvalidasi sesuatu yang hanya terjadi pada fasad kontrol / tampilan tertentu).
sumber
Di toko Java kami, kami sengaja membagi validasi widget web menjadi tiga operasi terpisah.
Jika layer 1 gagal, kami tidak memeriksa 2 atau 3. Demikian pula jika 1 berhasil dan 2 gagal kami tidak melakukannya 3. Ini menghentikan pesan kesalahan palsu yang dihasilkan.
Anda bertanya tentang nilai-nilai dalam panggilan REST daripada konten widget, tetapi prinsip yang sama berlaku.
sumber
Uji coba pendekatan didorong teduh pada ini ,, setelah semua tidak ada controller dan Anda harus memilih opsi lain. Jelas aturan bisnis harus di satu tempat, dan ini adalah kendala lain dalam keputusan Anda.
sumber