12

我在这里有一个非常幼稚的概念问题需要澄清。在我的应用程序中,我目前使用 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 来验证域逻辑?

4

2 回答 2

18

是的,您可以将 JSR 验证用于域逻辑验证。您需要定义自定义约束注释并在其中定义域逻辑验证。
Like
定义自定义约束注解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;
  ...
于 2012-07-08T09:25:53.313 回答
2

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

或者,如果您明确想要配置验证器,您可以这样做:

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

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

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

<mvc:annotation-driven validator="validator"/>
于 2012-07-07T22:10:16.437 回答