使用注释进行Spring验证与Hibernate验证

时间:2011-12-22 07:36:15

标签: spring validation spring-mvc hibernate-validator

我正在使用spring mvc 3.0创建一个演示应用程序。我必须在屏幕上应用验证。我在网上搜索并发现该应用程序主要使用两种类型的验证: -

  1. 使用验证的弹簧验证Api
  2. 使用hibernate验证进行Hibernate验证
  3. 希望有人给我一个建议,即在申请中实施一个好的建议。

1 个答案:

答案 0 :(得分:9)

我使用了两者 - 我更喜欢Hibernate验证 - 非常容易实现并且相当标准。在类路径上实现时会自动启用它。这是一个例子:

@EmailValidator
@NotBlank
@Length(max=65)
private String email; 

消息错误字符串来自何处?在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();
}

除此之外,到目前为止,使用Hibernate验证非常愉快。