Dengan Spring MVC, ada 3 cara berbeda untuk melakukan validasi: menggunakan anotasi, secara manual, atau campuran keduanya. Tidak ada "cara terbersih dan terbaik" unik untuk memvalidasi, tetapi mungkin ada satu yang lebih cocok dengan proyek / masalah / konteks Anda.
Mari Punya Pengguna:
public class User {
private String name;
...
}
Metode 1: Jika Anda memiliki Spring 3.x + dan validasi sederhana untuk dilakukan, gunakan javax.validation.constraints
anotasi (juga dikenal sebagai anotasi JSR-303).
public class User {
@NotNull
private String name;
...
}
Anda akan membutuhkan penyedia JSR-303 di perpustakaan Anda, seperti Hibernate Validator yang merupakan implementasi referensi (perpustakaan ini tidak ada hubungannya dengan database dan pemetaan relasional, itu hanya validasi :-).
Kemudian di controller Anda, Anda akan memiliki sesuatu seperti:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Perhatikan @Valid: jika pengguna memiliki nama nol, result.hasErrors () akan benar.
Metode 2: Jika Anda memiliki validasi yang kompleks (seperti logika validasi bisnis besar, validasi bersyarat di berbagai bidang, dll.), Atau karena alasan tertentu Anda tidak dapat menggunakan metode 1, gunakan validasi manual. Ini adalah praktik yang baik untuk memisahkan kode pengontrol dari logika validasi. Jangan membuat kelas validasi Anda dari awal, Spring menyediakan org.springframework.validation.Validator
antarmuka praktis (sejak Spring 2).
Jadi katakanlah Anda punya
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
dan Anda ingin melakukan validasi "kompleks" seperti: jika usia pengguna di bawah 18, pengguna yang bertanggung jawab tidak boleh nol dan usia pengguna yang bertanggung jawab harus di atas 21.
Anda akan melakukan sesuatu seperti ini
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
Kemudian di controller Anda, Anda akan memiliki:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Jika ada kesalahan validasi, result.hasErrors () akan benar.
Catatan: Anda juga dapat mengatur validator dalam metode @InitBinder pada controller, dengan "binder.setValidator (...)" (dalam hal ini campuran penggunaan metode 1 dan 2 tidak akan mungkin, karena Anda mengganti default validator). Atau Anda bisa instantiate di konstruktor default controller. Atau memiliki @ Component / @ Service UserValidator yang Anda masukkan (@Autowired) di controller Anda: sangat berguna, karena sebagian besar validator singletons + mengejek unit test menjadi lebih mudah + validator Anda dapat memanggil komponen Spring lainnya.
Metode 3:
Mengapa tidak menggunakan kombinasi kedua metode? Validasi hal-hal sederhana, seperti atribut "nama", dengan anotasi (cepat dilakukan, ringkas, dan lebih mudah dibaca). Pertahankan validasi berat untuk validator (saat itu akan memakan waktu berjam-jam untuk kode anotasi validasi kustom kompleks, atau hanya ketika itu tidak mungkin untuk menggunakan anotasi). Saya melakukan ini pada proyek sebelumnya, itu bekerja seperti pesona, cepat & mudah.
Peringatan: Anda tidak boleh salah mengartikan penanganan validasi untuk penanganan pengecualian . Baca posting ini untuk mengetahui kapan menggunakannya.
Referensi :