我为firstname创建了自定义验证器注释,如下所示:
public class ProfileBean {
@FirstNameValidator(minLength = 2L, maxLength = 10L, pattern = "firstname_pattern}",channelId="abcd")
private String firstName;
}
ProfileBean
是我的POJO,在自定义注释中,我想阅读minLength
,maxLength
和属性文件中的模式值。我怎么能这样做?
我还有一个问题需要支持不同的渠道。对于所有这些通道,bean将是不同的,但给定字段的注释相同如下: 通道1: 公共类ProfileBean {
@FirstNameValidator(minLength = 5L, maxLength = 100L, pattern = "[A-Za-z]{5,100}",channelId="abcd")
private String firstName;
}
通道2: 公共类RegisterBean {
@FirstNameValidator(minLength = 2L, maxLength = 10L, pattern = "[A-Za-z]{2,10}}",channelId="xyz")
private String foreName;
}
在这种情况下,验证实现是相同的,但可能是不同通道的参数值可能不同的情况。在这种情况下,我们如何根据渠道加载不同的属性。 在我的例子中,我已经在xml中定义了消息bean,并且通过使用该bean的实例,我必须读取属性值。
答案 0 :(得分:0)
您不能直接在ProfileBean
中执行此操作,因为传入Annotation值的所有内容都必须是Constant Expressions。你能做的是
public @interface FirstNameValidator {
public String minLengthProp() default "min.length";
public String maxLengthProp() default "max.length";
public String patternProp() default "min.length";
...
}
并在您的自定义验证程序的initialize
方法实现
private Properties properties ... // Load properties
private ThreadLocal<Integer> maxLength = new ThreadLocal<Integer>();
private ThreadLocal<Integer> minLength = new ThreadLocal<Integer>();
private ThreadLocal<String> pattern = new ThreadLocal<String>();
@Override
public void initialize(FirstNameValidator firstNameValidator) {
if(firstNameValidator.minLength() == null) {
minLength.set(Integer.parseInt(properties.getProperty(firstNameValidator.minLengthProp())));
}
...
}
并在您的isValid
方法
@Override
public boolean isValid(User user,
ConstraintValidatorContext constraintValidatorContext) {
minLength.get()
...
}
并在ProfileBean
@FirstNameValidator(minLengthProp = "name.minLength", maxLengthProp = "name.maxLength", patternProp = "name.pattern")