Doğrulama gerçekleştirmek için Nasıl ?Spring MVC :
Kullanıcı giriş formu doğrulama gerçekleştirmek için en temiz ve en iyi yolu nedir bilmek istiyorum. Bazı geliştiriciler org uygulamak gördüm.springframework.doğrulama.Doğrulayıcı. Bu konuda bir soru : bir sınıf doğrular gördüm. Sınıf el ile kullanıcı giriş değerleri ile dolu olmak, ve sonra doğrulayıcı geçirilen var mı?
Kullanıcı girişini doğrulamak için en temiz ve en iyi yolu hakkında kafam karıştı. Ben isteği kullanarak ilgili geleneksel yöntem.() getParameter ve sonra el ile boşluk için kontrol, ama benim Denetleyicisi tüm doğrulama yapmak istemiyorum. Bu alanda bazı iyi bir tavsiye büyük takdir edilecektir. Bu uygulamada Hazırda kullanıyorum.
CEVAP
Spring MVC ile doğrulama gerçekleştirmek için 3 farklı yolu vardır : kullanarak açıklama, el ile, ya da her ikisinin bir karışımı. "En temiz ve en iyi bir şekilde" doğrulamak için, ama muhtemelen proje/sorun/içerik daha iyi uyan bir tane var. bir benzersiz yok
Hadi bir Kullanıcı var :
public class User {
private String name;
...
}
Yöntem 1 :Eğer Bahar 3 varsa.x ve basit doğrulama, javax.validation.constraints
ek açıklama (genel amaçlı-303 notları olarak da bilinir) kullanın.
public class User {
@NotNull
private String name;
...
}
İhtiyacınız olacak bir genel amaçlı-303 sağlayıcısı senin librairies, gibi Hibernate Validator kim referans uygulama (bu kütüphane ile bir ilgisi yok, veritabanları ve ilişkisel eşleme, sadece yok doğrulama :-).
Sizin Denetleyicisi gibi bir şey olurdu o zaman :
@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
}
}
@Geçerli dikkat : eğer kullanıcı bir boş isim olursa, sonuç.() hasErrors doğru olacaktır.
Yöntem 2 :Eğer karmaşık doğrulama (gibi büyük bir iş mantığı doğrulama, birçok alanda koşullu doğrulama, vb.), varsa ya nedense yöntem 1'i kullanın, manuel doğrulama kullanamazsınız. Doğrulama mantık denetleyicisinin kod ayırmak için iyi bir uygulamadır. Doğrulama sınıfı(es) sıfırdan yaratmak değil, bir Bahar kullanışlı org.springframework.validation.Validator
arayüz (Bahar 2'den beri) sağlar.
Hadi olduğunu varsayalım
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
ve bazı "kullanıcı yaş null olmamalı responsibleUser 18, altında ve responsibleUser yaşı 21 üzerinde olmalıdır." gibi doğrulama : karmaşık yapmak istiyorum
Böyle bir şey yapmayacaksı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
}
}
Sizin denetleyicisi olurdu o zaman :
@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
}
}
Eğer doğrulama hataları varsa, sonuç.() hasErrors doğru olacaktır.
Not : ayrıca "Ciltçi.kumandayı @İnitBinder bir yöntem doğrulayıcı ayarlayabilirsiniz(...) setValidator" bu durumda, yöntem 1 ve 2'nin karışımı bir kullanım varsayılan doğrulayıcı değiştirin, çünkü mümkün olmaz (). Ya denetleyicisi varsayılan kurucuyu bunun örneğini. Ya da bir @Component/@Hizmet UserValidator sana enjekte (@Autowired) denetleyici : çok yararlı, çünkü en elemanları olan tek birim test alay daha kolay olur senin doğrulayıcı diye adlandır diğer Bahar bileşenleri.
Yöntem 3 : Neden her iki yöntem bir arada kullanarak değil mi? Doğrulamak basit şeyler, "name" özniteliği, ek açıklamalar (hızlı, kısa ve daha okunabilir). Katılmak için ağır doğrulamalarını saat özel karmaşık doğrulama ek açıklamalar kod alır, ya da olası ek açıklamalar kullanmak için değil sadece! Eski bir proje yaptım, bir çekicilik, hızlı ve kolay gibi çalıştı.
Uyarı :hata olmamalıdırdoğrulama kullanmaiçinözel durum işleme. Bunları kullanmak için zaman bilmek Read this post.
Referanslar :
Nasıl bir gerçekleştirmek için bir SQL...
Nasıl, asenkron yerine senkron AJAX is...
Nasıl açıkladın programlı olarak Dinle...
düzenli ifade doğrulama için bir kural...
İllegalStateException: önlemek için Na...