Генерация шаблона сообщения об ограничении по умолчанию с проверкой бина
Как бы я хотел создать шаблон сообщения по умолчанию для ограничения (в сущности 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, поэтому ничего не поделаешь.