Как указать аннотацию Hibernate "@Pattern", используя регулярное выражение из a.свойства файла или базы данных
ситуация: Я хотел бы выполнить проверку Hibernate на основе свойств пользователя (чтобы разрешить различные правила проверки для ввода на основе данных учетной записи Пользователя) - я думаю, что это должно быть возможно использовать .файл свойств для указания определенного регулярного выражения, но я не могу понять, что не так:
мой текущий метод указания регулярного выражения проверки вытягивает это регулярное выражение из константы в определенном файле интерфейса (чтобы сохранить все вместе) и подключает его как константу в @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...}
звонки поступают от .файл свойств:
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, а не предопределенная и предварительно скомпилированная константа?
1 ответов
в аннотациях вы можете ссылаться только на постоянные выражения, поэтому загрузка значений из файла свойств или базы данных здесь не будет работать.
можно использовать API для динамического объявления ограничений, введенного в Hibernate Validator 4.2, который позволяет определять ограничения во время выполнения. Ваш пример может выглядеть так:
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();