使用JSR-303验证器而不是Spring验证器

时间:2012-07-07 20:16:21

标签: spring spring-mvc

我在这里有一个非常天真的概念问题需要澄清。在我的应用程序中,我目前正在使用JSR 303 Hibernate Validator来验证带有@NotBlank和@NotNull注释的域模型,比如检查用户名,密码等。

public class Admin {

  private Long id;
  @NotBlank(message = "Username should not be null")
  private String username;
  @NotBlank(message = "Username should not be null")
  private String password;
  ...

但是为了验证像现有用户名这样的域逻辑,我仍然使用Spring的Validator接口

@Component
public class AdminValidator implements Validator {
  ...
  @Override
  public void validate(Object target, Errors errors) {
    Admin admin = (Admin) target;
    if (usernameAlradyExist())){
        errors.rejectValue("username", null, "This user already exist's in the system.");
    }

}

在控制器中我正在使用两者

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@Valid @ModelAttribute("admin") Admin admin, BindingResult bindingResult,) {
    validator.validate(admin, bindingResult);
    if (bindingResult.hasErrors()) {
        return REGISTER_ADMIN.getViewName();

    }

是否可以使用Hibernate Validator而根本不使用Spring Validator来验证域逻辑?

2 个答案:

答案 0 :(得分:17)

是的,您可以使用JSR验证进行域逻辑验证。您需要定义自定义约束注释并在其中定义域逻辑验证 像
定义自定义约束注释UserExistsConstraint

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy=UserExistsConstraintValidator.class)

public @interface UserExistsConstraint {
 String message() default "This user already exist's in the system.";
 Class<!--?-->[] groups() default {};
 Class<!--? extends Payload-->[] payload() default {};
}   

为自定义注释定义验证器。

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, object=""> {

 @Override
 public void initialize(UserExistsConstraint constraint) {

 }

 @Override
 public boolean isValid(Object target, ConstraintValidatorContext context) {
   if (usernameAlradyExist())
   {    
     return false;
   }
   else
   {
     return true; 
   }    
 }
}

使用自定义注释

public class Admin {

  private Long id;
  @NotBlank(message = "Username should not be null")
  @UserExistsConstraint
  private String username;
  @NotBlank(message = "Username should not be null")
  private String password;
  ...

答案 1 :(得分:2)

如果您使用<mvc:annotation-driven/>配置Spring MVC,那么如果类路径中存在某些JSR 303验证器impl(例如,hibernate-validator),它将自动配置JSR 303 validator

或者,如果您明确要配置验证程序,则可以执行以下操作:

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

这将再次寻找JSR 303实现并将其用作验证器。

您可以通过以这种方式注册全局验证器来默认它来验证任何@Valid表单对象:

<mvc:annotation-driven validator="validator"/>