Я использовал оба - мне больше нравится Hibernate Validation - довольно легко реализовать и довольно стандартно.Он автоматически включается, когда у вас есть реализация на пути к классам.Вот пример:
@EmailValidator
@NotBlank
@Length(max=65)
private String email;
Откуда исходит сообщение Error String?В WEB-INF у вас должен быть файл messages.properties:
NotBlank.ForgotPasswordBackingObject.email=Email address must be present
Существует стандартная аннотация @Email, но электронная почта, такая как: me @ mycompany, считается действительной, поэтому мне пришлосьсделать свой собственный @EmailValidator (в стандартной реализации изменил флаг регулярного выражения с * на +).Я столкнулся с некоторыми проблемами: порядок проверки - какую проверку вы хотите выполнить в первую очередь, это делается с группами проверки, но это невозможно с аннотацией @Valid, например:
@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword")
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal)
Вот почему, если у вас есть ваш контроллер в этой форме (например, в Spring MVC), то вы должны смоделировать свою логику таким образом - я тоже это сделал.может сделать это для проверки двух или более полей одновременно (что я нашел довольно полезным):
@FieldMatch.List({
@FieldMatch(firstValue = "password" , secondValue = "confirmPassword")
})
public class RequestAccountBackingObject implements Serializable {
private String password;
private String confirmPassword;
И реализация:
@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(); }
}
Другой FieldMatchImpl будет:
public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{
private String firstFieldName;
private String secondFieldName;
и вам нужно реализовать два метода:
public void initialize(final FieldMatch constraintAnnotation){
firstFieldName = constraintAnnotation.firstValue();
secondFieldName = constraintAnnotation.secondValue();
Также:
public boolean isValid(final Object value, final ConstraintValidatorContext context){
final String firstObj = BeanUtils.getProperty(value, firstFieldName);
final String secondObj = BeanUtils.getProperty(value, secondFieldName);
Используя org.apache.commons.beanutils.BeanUtils, вы теперь можете проверить дваполя.
Примерно так:
boolean result = firstObj.equals(secondObj);
if(!result) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation();
}
Кроме того, до сих пор было очень приятно использовать проверку гибернации.