2011-12-22 145 views
9

我正在使用spring mvc 3.0创建一个演示应用程序。我必须通过screen.I在网上进行验证,发现主要有两种类型的验证与应用: -Spring验证与使用注释的Hibernate验证

  1. 春天验证使用验证阿比
  2. 使用Hibernate验证休眠验证

希望有人给我哪一个是在应用程序中实现一个良好的建议。

回答

9

我使用了两个 - 我喜欢Hibernate验证更多 - 很容易实现和相当标准。当你在类路径上有一个实现时它会自动启用。这里是一个例子:

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

消息错误字符串从哪里来?在WEB-INF你必须有一个名为messages.properties:

NotBlank.ForgotPasswordBackingObject.email=Email address must be present 

有一个标准@Email注释,但一个电子邮件,例如:我@ myCompany的被认为有效,这就是为什么我必须让我的自己的@EmailValidator(在标准实现中将正则表达式标志从*更改为+)。 有迹象表明,我碰到一些问题:验证顺序 - 你想先发生,这与确认团组做哪些验证,但这是不可能的@Valid注释,例如:

@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword") 
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal) 

这就是为什么如果你有这种形式的Controller(例如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的验证到目前为止一种乐趣。

+0

感谢您给予一个很好的理解回复尤金,那另一个验证呢? – Anshul 2011-12-22 09:44:06

+0

我希望我能为你详细解答一个答案,但是我使用Spring验证已经很长时间了。:(因为JSR 303成为规范和Hibernate Validator的参考实现,我真的认为Spring将自己转向相同的方向。 – Eugene 2011-12-23 15:04:07