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

Ral*_*lph 8 java spring hibernate bean-validation

可能重复:
使用Hibernate Validator而不调用注释.

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

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

我在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 {
   …
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sim*_*all 2

实现此目的的一种方法是编写一个完整的自定义验证器,并将逻辑下推到该类中,该类的注释仅使用该验证器。这意味着您拥有一个独立的编译单元(一个完整的类PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...),您可以独立于注释使用它。这种方法还可以让您更轻松地对验证进行单元测试。

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