Spring MVC ile, doğrulama yapmanın 3 farklı yolu vardır: ek açıklama kullanma, manuel olarak veya her ikisinin bir karışımını kullanma. Doğrulamanın benzersiz bir "en temiz ve en iyi yolu" yoktur, ancak muhtemelen projenize / probleminize / içeriğinize daha iyi uyan bir yöntem vardır.
Bir Kullanıcı edelim:
public class User {
private String name;
...
}
Yöntem 1: Bahar 3.x + ve basit doğrulama varsa, javax.validation.constraints
ek açıklamaları (JSR-303 ek açıklamaları olarak da bilinir) kullanın.
public class User {
@NotNull
private String name;
...
}
Referans uygulaması olan Hibernate Validator gibi kütüphanelerinizde bir JSR-303 sağlayıcısına ihtiyacınız olacaktır (bu kütüphanenin veritabanları ve ilişkisel eşleme ile ilgisi yoktur, sadece doğrulama :-).
Sonra kumandanızda şöyle bir şey olurdu:
@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
}
}
@Valid öğesine dikkat edin: Kullanıcının boş bir adı varsa, sonuç.hasErrors () doğru olacaktır.
Yöntem 2: Karmaşık doğrulamanız varsa (büyük işletme doğrulama mantığı, birden çok alanda koşullu doğrulama vb.) Veya herhangi bir nedenle yöntem 1'i kullanamıyorsanız manuel doğrulama kullanın. Denetleyicinin kodunu doğrulama mantığından ayırmak iyi bir uygulamadır. Doğrulama sınıflarınızı sıfırdan yaratmayın, Spring kullanışlı bir org.springframework.validation.Validator
arayüz sağlar (2. Bahardan beri).
Diyelim ki var
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
ve "karmaşık" bir doğrulama yapmak istersiniz: kullanıcının yaşı 18'in altındaysa, sorumluKullanıcı boş olmamalı ve sorumluKullanıcı yaşı 21 yaşından büyük olmalıdır.
Böyle bir şey yapacaksın
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
}
}
Sonra kumandanızda:
@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
}
}
Doğrulama hataları varsa, sonuç.hasErrors () doğru olacaktır.
Not: Doğrulayıcıyı denetleyicinin @InitBinder yönteminde "binder.setValidator (...)" ile de ayarlayabilirsiniz (bu durumda yöntem 1 ve 2'nin karma kullanımı mümkün olmaz, çünkü varsayılanı değiştirirsiniz) doğrulayıcı). Veya denetleyicinin varsayılan yapıcısında başlatabilirsiniz. Ya da kumandanıza enjekte ettiğiniz @ @ Bileşen / @ Servis UserValidator'ınız olsun: çok yararlı, çünkü çoğu validatör tektonludur + birim test alayları daha kolay hale gelir + validatörünüz diğer Spring bileşenlerini çağırabilir.
Yöntem 3:
Neden her iki yöntemin birleşimini kullanmıyorsunuz? "Name" özelliği gibi basit şeyleri ek açıklamalarla doğrulayın (hızlı, özlü ve daha okunaklı). Doğrulayıcılar için ağır doğrulamaları saklayın (özel karmaşık doğrulama ek açıklamalarının kodlanması saatler alacaksa veya yalnızca ek açıklamaların kullanılması mümkün olmadığında). Bunu eski bir projede yaptım, hızlı ve kolay bir cazibe gibi çalıştı.
Uyarı: Kural dışı durum işleme için doğrulama işlemesinde hata yapmamalısınız . Ne zaman kullanılacağını bilmek için bu yayını okuyun .
Referanslar :