Użyłem obu - lubię Hibernate Validation więcej - całkiem łatwe do wdrożenia i dość standardowe. Jest on automatycznie włączany, gdy masz implementację w ścieżce klas. Oto przykład:
@EmailValidator
@NotBlank
@Length(max=65)
private String email;
Skąd pochodzi komunikat Error String? W WEB-INF trzeba mieć plik o nazwie messages.properties:
NotBlank.ForgotPasswordBackingObject.email=Email address must be present
Jest to standardowy @Email adnotacja, ale e-mail, takie jak: me @ MyCompany jest uważany za ważny, dlatego musiałem zrobić mój własne @EmailValidator (zmieniono flagę regex z * na + w standardowej implementacji). Są pewne kwestie, które natknąłem: Kolejność walidacji - walidacja który chcesz zdarzyć pierwsze, odbywa się to z grupami walidacji, ale to nie jest to możliwe z @Valid adnotacji, na przykład:
@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword")
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal)
Dlatego jeśli masz kontroler w tej formie (na przykład w Spring MVC), musisz symulować swoją logikę w pewien sposób - ja też to zrobiłem.
Kolejna fajna rzecz, że można zrobić to do Weryfikacja dwa lub więcej pól w momencie (co uważam za bardzo przydatne):
@FieldMatch.List({
@FieldMatch(firstValue = "password" , secondValue = "confirmPassword")
})
public class RequestAccountBackingObject implements Serializable {
private String password;
private String confirmPassword;
i wdrożenie:
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchImpl.class)
@Documented
public @interface FieldMatch{
String message() default "{com.errorMessage}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String firstValue();
String secondValue();
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@interface List
{ FieldMatch[] value(); }
}
Drugi FieldMatchImpl będzie:
public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{
private String firstFieldName;
private String secondFieldName;
i potrzebujesz dwóch wdrożonych metod:
public void initialize(final FieldMatch constraintAnnotation){
firstFieldName = constraintAnnotation.firstValue();
secondFieldName = constraintAnnotation.secondValue();
również:
public boolean isValid(final Object value, final ConstraintValidatorContext context){
final String firstObj = BeanUtils.getProperty(value, firstFieldName);
final String secondObj = BeanUtils.getProperty(value, secondFieldName);
Korzystanie org.apache.commons.beanutils.BeanUtils można teraz sprawdzić poprawność dwa pola.
Jak to:
boolean result = firstObj.equals(secondObj);
if(!result) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation();
}
Inne następnie, że została ona przyjemność korzystania z hibernacji Validation tak daleko.
Dzięki za udzielenie dobrego zrozumienia odpowiedzi Eugene, a co z inną walidacją ..? – Anshul
Chciałbym móc szczegółowo odpowiedzieć, ale minęło dużo czasu odkąd użyłem Weryfikacji wiosennej.:(A ponieważ JSR 303 stał się specyfikacją i Hibernate Validator implementacją referencyjną, naprawdę myślę, że Spring obróci się w tym samym kierunku. – Eugene