情况:我想根据用户属性执行Hibernate验证(允许根据用户的帐户数据对输入执行不同的验证规则)-我认为必须可以使用.properties文件来指定特定的正则表达式,但我不知道错在哪里:
我目前指定验证正则表达式的方法是从特定接口文件中的常量中提取该正则表达式(以将所有内容保持在一起),并将其作为常量插入每个变量的@Pattern()
注释中,例如变量workPhone
:
@Column(name = "WORK_PHONE")
@NotEmpty(message = "{ContactInfo.workPhone.notEmpty}")
@Pattern(regexp = PHONE_NUMBER_PATTERN_SL, message = "{ContactInfo.workPhone.regexp.msg}")
@Size(max = 10, message = "{ContactInfo.workPhone.size}")
protected String workPhone;
其中正则表达式存储在static final String
PHONE_NUMBER_PATTERN_SL
中,所有{ContactInfo.workPhone...}
调用都来自.properties文件:
ContactInfo.workPhone.notEmpty=Please enter your phone number.
ContactInfo.workPhone.regexp.msg=Invalid characters entered in phone. Use this format XXX-XXX-XXXX.
ContactInfo.workPhone.size=Phone can not be longer than 10 digits.
不幸的是,这种安排使验证模式在应用程序范围内(已编译),因为我无法找到一种方法来为不同公司、地点、工作岗位等的不同用户更改它。为了能够根据这些信息进行区分,我还想将正则表达式存储在属性文件中,并尝试以这种方式将其包括在内:
ContactInfo.workPhone.regexp=d{3}-d{3}-d{4}
同时在注释中包括来自第一代码列表中的第三行的引用:
@Pattern(regexp = "{ContactInfo.workPhone.regexp}", message = "{ContactInfo.workPhone.regexp.msg}")
然后,我会在不同的场合切换属性文件,例如允许/要求使用非美国电话号码格式。
问题:有可能做我想做的事吗?有没有更好的方法来指定模式(甚至可能允许数据库调用而不是属性文件)?
此外,我在这方面还不是最擅长的(因为我正在接替另一位开发人员),所以如果有人能给我指一个关于@Pattern注释或其他Hibernate regex验证标记使用的重点资源,那么这可能会给我提供我需要的所有信息。
TL;DR:是否可以为Hibernate模式验证中使用的表达式使用动态设置或修改的值,而不是预定义和预编译的常量?
在注释中,您只能引用常量表达式,因此从属性文件或数据库加载值在这里不起作用。
您可以使用在Hibernate Validator 4.2中引入的API动态约束声明,该声明允许在运行时定义约束。你的例子可能是这样的:
String dynamicPattern = ...;
ConstraintMapping mapping = new ConstraintMapping();
mapping.type( ContactInfo.class )
.property( "workPhone", FIELD )
.constraint( new PatternDef().regexp( dynamicPattern ) );
HibernateValidatorConfiguration config =
Validation.byProvider( HibernateValidator.class ).configure();
config.addMapping( mapping );
Validator validator = config.buildValidatorFactory().getValidator();