Генерация шаблона сообщения об ограничении по умолчанию с проверкой бина

Как бы я хотел создать шаблон сообщения по умолчанию для ограничения (в сущности JPA), если такой шаблон сообщения уже не определен в самой аннотации.

Вот что я имею в виду. Предположим, у меня есть объект JPA "Пустышка":

@Entity
public class Dummy {
    @Column
    @NotNull
    Long id;
}

Также предположим, что у меня есть файл ValidationMessages.properties, содержащий:

Dummy.id.NotNull=ID of dummy should not be null

Теперь, если бы я определил ограничение @NotNull как @NotNull(message={Dummy.id.NotNull}), все работало бы хорошо, но что если бы я захотел сгенерировать шаблон '{Dummy.id.NotNull}' на лету (используя отражение), поэтому мне не нужно писать один и тот же стандартизированный шаблон для каждого ограничения? Я пробовал это с использованием класса MessageInterpolator, но метод интерполяции вызывается только тогда, когда определен атрибут сообщения, и это противоречит цели того, что я пытаюсь сделать.

Итак, чтобы было понятно, как я могу заставить валидатор спрашивать часть моего кода: "Эй, что за сообщение для ограничения" NotNull "в поле" id "в классе" Dummy ", даже если ему не назначено сообщение? (точнее, ему назначено сообщение по умолчанию)?"

1 ответ

Решение

Я был не прав - MessageInterpolator вызывается, даже если явное сообщение не было определено в аннотации. Это в значительной степени отвечает на мой вопрос. Осталось только выяснить, как получить проверяемое имя поля.

РЕДАКТИРОВАТЬ:

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

В этой заметке мне показалось забавным, что нет способа отследить аннотированный элемент (будь то поле, метод, класс или параметр) при доступе к экземпляру аннотации. Если бы это было возможно, я мог бы получить имя поля динамически, но это кажется "недостатком" Java, поэтому ничего не поделаешь.

Другие вопросы по тегам