Как указать аннотацию 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();