8

情况:我想根据用户属性执行休眠验证(以允许根据用户的帐户数据输入不同的验证规则) - 我认为必须可以使用 .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;

...正则表达式存储在.properties 文件中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 正则表达式验证标记的重点资源,那么可能会给我我需要的所有信息。

TL;DR:是否可以为 Hibernate 模式验证中使用的表达式使用动态设置或修改的值,而不是预定义和预编译的常量?

4

1 回答 1

6

在注释中,您只能引用常量表达式,因此从属性文件或数据库加载值在这里不起作用。

您可以使用在 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();
于 2012-01-27T20:55:05.633 回答