Как мне указать аннотацию Hibernate @Pattern, используя регулярное выражение из файла .properties или базы данных

Ситуация: я хотел бы выполнить проверку 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, то это может дать мне всю необходимую информацию.

TL;DR: можно ли использовать динамически устанавливаемое или измененное значение для выражения, используемого при проверке шаблона Hibernate, вместо предопределенной и предварительно скомпилированной константы?


person Code Jockey    schedule 24.01.2012    source источник


Ответы (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();
person Gunnar    schedule 27.01.2012
comment
У меня сложилось впечатление, что 3 «сообщения» в моем примере вызывались таким образом, чтобы их можно было изменить без перекомпиляции — возможно, это не так (я не проверял) — это выглядит многообещающе, но основано в некоторых вещах я пока не совсем понимаю - надо будет попробовать, скрестив пальцы - Спасибо! - person Code Jockey; 31.01.2012
comment
Я не решаюсь пометить как ответ, потому что у меня еще не было возможности что-либо протестировать - мне сказали, что мы продолжаем использовать только аннотации (я думаю, потому что они красивые ??)... однако выглядит очень многообещающе, так что по крайней мере +1 - Спасибо за ваше время! возможно, у меня будет время вернуться в какой-то момент и на самом деле проверить это, или, может быть, я просто хочу, чтобы мои принятые ответы подсчитывались (кто знает?), И я вернусь и приму это: D - person Code Jockey; 10.02.2012