Как указать аннотацию Hibernate "@Pattern" с помощью регулярного выражения из файла .properties или базы данных - PullRequest
6 голосов
/ 25 января 2012

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

1 Ответ

3 голосов
/ 28 января 2012

В аннотациях вы можете ссылаться только на константные выражения, поэтому загрузка значений из файла свойств или базы данных здесь не будет работать.

Вы можете использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...