Как при проверке коллекции bean-компонентов указать в сообщении об ошибке, какой элемент коллекции является ошибочным?

У меня есть компонент, который ссылается на коллекцию других компонентов. Я использую @Valid, чтобы включить в проверку все бины, на которые есть ссылки.

public class MasterBean {
    @Valid
    private Collection<DetailBean> details;
    ... 
}

public class DetailBean {
    private String id;

    @NotBlank(message = "{name_not_blank_message_key}")
    private String name;
    ...
}

Пока это работает нормально, пользователь получает все сообщения об ошибках проверки от всех DetailBean экземпляров. Однако сообщения об ошибках не содержат никаких указаний на то, к каким из экземпляров они относятся. В идеале пользователь должен увидеть что-то вроде «Имя что-то отсутствует», где something - это свойство (например, id) данного экземпляра. К сожалению, стандартный MessageInterpolator позволяет использовать заполнители только для параметров статической аннотации (например, {min}) и не поддерживает подстановку свойств компонента.

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

Еще немного предыстории: я работаю над проектом JSF 2 с широким использованием тегов RichFaces. Проверяемый bean-компонент является частью вспомогательного bean-компонента страницы JSF, проверка запускается тегом <rich:graphValidator> при отправке формы. Серверная часть - это Hibernate Validator.


person sandorb    schedule 30.01.2013    source источник
comment
Это JSF 1.2 или JSF 2?   -  person Luiggi Mendoza    schedule 30.01.2013
comment
Это JSF 2. (Обновил вопрос.)   -  person sandorb    schedule 30.01.2013


Ответы (1)


Если вы просто хотите интерполировать проверенное значение и используете Hibernate Validator 4.x, вы можете использовать ValueFormatterMessageInterpolator. Это также настраиваемый MessageInterpolator, но вам не нужно ничего реализовывать самостоятельно.

Полностью настраиваемый рендеринг (включая навигацию по свойствам bean-компонентов a la Expression Language) будет поставляться с Bean Validation 1.1 и Hibernate Validator 5. Эти функции реализованы, но еще не доступны в окончательной версии. См. Также BVAL-223 и HV-676.

person Hardy    schedule 31.01.2013
comment
Спасибо, что ознакомили меня с ValueFormatterMessageInterpolator, хотя я не могу использовать его напрямую в моем случае. Свойства, которые я должен проверить, не дают хорошей ссылки на сам компонент для пользователей (например, строка, которая нарушает @NotBlank, не очень помогает в сообщении об ошибке). - person sandorb; 31.01.2013