我有这个复合约束注释(仅用于说明):
@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提供程序)
答案 0 :(得分:2)
执行此操作的一种方法是编写完整的自定义验证程序,然后将逻辑推入具有注释的类中,只使用验证程序。这意味着你有一个独立的编译单元(一个完整的类PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...
),你可以独立于注释使用它。这种方法还可以让您更轻松地对验证进行单元测试。
但是,由于您使用注释作为配置Hibernate提供的现有正则表达式验证器的方法,您可以使用该注释,而不是从注释类传递常量模式。您还应该能够将长度约束打包到正则表达式中,这比同时使用两个注释更简单,更快捷。