没有注释的程序化Bean验证(JSR 303)

时间:2011-06-10 07:40:35

标签: java hibernate spring bean-validation

  

可能重复:
  using Hibernate Validator without calling annotation.

我有这个复合约束注释(仅用于说明):

@Target... @Retention...
@Constraint(validatedBy = {})
@Pattern(regexp = PasswordComplexity.AT_LEAST_TWO_NONE_ALPAH_CHARS)
@Length(min = 6, max = 20)
public @interface PasswordComplexity {   
    ...    
}

我在Spring Controllers和Entity Classes中使用它。

但是现在我需要检查Service方法中的单个String,我需要将相同的约束应用于单个String。由于约束是相同的,我想使用相同的约束定义(@PasswordComplexity)(单一事实来源)。类似的东西:

public void createUser(UserDto userDto, String password) {
  if(hasViolation(validator.validate(password,PasswordComplexity.class))) {
   throw new PasswordComplexityViolationException();
  } else {
   …
  }
}

但我不知道如何为未注释的简单对象(String)运行JSR 303 Validator。它至少是可能的,怎么样?

(我使用Hibernate Validator作为JSR 303提供程序)

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是编写完整的自定义验证程序,然后将逻辑推入具有注释的类中,只使用验证程序。这意味着你有一个独立的编译单元(一个完整的类PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...),你可以独立于注释使用它。这种方法还可以让您更轻松地对验证进行单元测试。

但是,由于您使用注释作为配置Hibernate提供的现有正则表达式验证器的方法,您可以使用该注释,而不是从注释类传递常量模式。您还应该能够将长度约束打包到正则表达式中,这比同时使用两个注释更简单,更快捷。