Проверить произвольные объекты в JSF?

Итак, вы можете проверить ввод, используя аннотации JSR-303 для свойства привязки bean-компонента:

class Ticket {
    @MinAge(18)
    Person person;
}

class Person {
    @Min(1) @Max(100)
    int age;
}

<p:inputText id="age" value="#{bean.ticket.person.age}" />

Здесь свойство Person.age проверяется (между 1..100) без проблем.

Проблема в том, что я хочу проверить внешний экземпляр (person.age> = 18). Но как сделать, чтобы свойство bean.ticket.person было известно валидации?

Я хочу что-то вроде:

<p:inputText id="age" value="#{bean.ticket.person.age}">
    <f:validate value="#{bean.ticket.person}" />
</p:inputText>

Or:

<p:inputText id="age" value="#{bean.ticket.person.age}">
    <f:validator id="jsr303-validator" value="#{bean.ticket.person}" />
</p:inputText>

Проблема в том, что я не могу передать значение <f:validator />. Я хочу добавить дополнительные свойства в процесс проверки, больше, чем только вводимые данные, появившиеся на странице.

P.S. Это упрощенный пример, реальное приложение:

...
<p:inputText id="principalLabel" value="${activeACL.principal.label}" readonly="true" />
<p:commandButton value="Choose..." onclick="choosePrincipalDialog.show()" />
...
<p:commandButton value="Save" action="${bean.saveACL}" oncomplete="editACLDialog.hide()" update="index" />

И activeACL типа ACL_DTO:

class ACL_DTO {
    ...
    @IdRequired
    Principal_DTO principal;
}

Здесь actionListener choosePrincipalDialog неявно изменит ${activeACL.principal.id}, который изначально равен null. IdRequired - это настраиваемое ограничение, которое ограничивает свойство члена id объекта не равным нулю или -1.

Тем не менее, я могу изменить использование @NotNull в свойстве id и добавить скрытый ввод, чтобы включить проверку идентификатора:

class Principal_DTO {
    ...
    @NotNull
    @Min(0)
    Long id;
}

...
<h:inputHidden id="principalId" value="${activeACL.principal.id}" />
<h:inputText id="principalLabel" ...

Но таким образом я больше не могу повторно использовать сообщения проверки. Выдавать пользователю сообщения типа «Эта строка не должна быть нулевой», «Это значение не должно быть -1» кажется бессмысленным.


person Xiè Jìléi    schedule 16.01.2012    source источник


Ответы (1)


Во-первых, я думаю, что вы должны использовать beans только как место, где вы можете получить свой ввод. После этого вы присваиваете значение модели. На мой взгляд, bean-компоненты не следует использовать напрямую как модель, а скорее как bean-компоненты, поддерживающие веб-форму (каждая веб-форма имеет свой bean-компонент).

Во-вторых, я согласен с тем, что вы сталкиваетесь со сценариями, в которых у вас есть зависимость от других данных для выполнения проверки (например, если пользователь выбрал США в качестве страны, почтовый индекс и т. Д. Не должен оставаться пустым). Здесь вы можете посмотреть, как реализовать настраиваемую аннотацию: Проверка перекрестных полей с помощью валидатора гибернации (JSR 303)

Если вы не используете проверку bean-компонента, вы всегда можете реализовать собственный класс валидатора или даже определить метод проверки непосредственно в bean-компоненте: http://docs.oracle.com/javaee/6/tutorial/doc/bnavb.html#bnave.

person 1337    schedule 04.06.2012