如何从Spring MVC中的自定义验证器中的属性文件中读取参数值

时间:2015-02-26 07:16:23

标签: java spring spring-mvc

我为firstname创建了自定义验证器注释,如下所示:

public class ProfileBean {

    @FirstNameValidator(minLength = 2L, maxLength = 10L, pattern = "firstname_pattern}",channelId="abcd")
    private String firstName;
}

ProfileBean是我的POJO,在自定义注释中,我想阅读minLengthmaxLength和属性文件中的模式值。我怎么能这样做?

我还有一个问题需要支持不同的渠道。对于所有这些通道,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的实例,我必须读取属性值。

1 个答案:

答案 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")