2011-06-10 70 views
8

可能重复:
using Hibernate Validator without calling annotation.编程Bean验证(JSR 303)无注释

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

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

而且我在Spring控制器和实体类中使用它。

但现在我需要检查一个服务方法中的单个字符串,我需要将相同的约束应用于单个字符串。由于约束条件相同,我想使用约束的相同定义(@PasswordComplexity)(单一来源)。喜欢的东西:

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

但我不知道该怎么办好了JSR 303验证一个没有注释的简单对象(字符串)。至少有可能,以及如何?

(我使用Hibernate验证作为JSR 303提供)

+0

我明白'单一来源的真相',你的意思是不必重复你的注释,它可能放在'UserDto'类的'password'属性/字段中,对吧?但在你的“类似”例子中,你至少要重复注释的名称('PasswordComplexity')。这不是冗余吗? – 2011-06-10 09:08:38

+0

@Grzegorz Oledzki:没问题的是不要在不同的地方使用注释。对于“单一真相源”,我的意思是我想使用注释,而不是在别处写同样的东西(长度和模式)定义。 – Ralph 2011-06-10 09:56:35

+0

@abalogh:问题是重复的(我把它覆盖了),但接受的答案与问题不符 - 或者至少不是我的问题。 – Ralph 2011-06-10 10:10:19

回答

2

一种方式做,这将是写一个完整的自定义验证,并且向下推动逻辑成类具有注释只使用验证。这意味着你有独立的编译单元(完整的类PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...),你可以独立使用注释。这种方法还可以使您更容易地单元测试验证。

但是,由于您使用注释作为配置由Hibernate提供的现有正则表达式验证程序的一种方式,因此您可以使用该注释,从注释类传递常量模式。你也应该能够将你的长度约束打包到正则表达式中,这比起两种注释都更简单快捷。