2012-01-16 3 views
2

Таким образом, вы можете подтвердить ввод данных с использованием JSR-303 аннотации на связывающим свойства компонента:Подтвердить произвольные объекты в JSF?

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> 

Или:

<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 «s будет неявным Изменение ${activeACL.principal.id}, которое первоначально null. IdRequired - это настраиваемое ограничение, которое ограничивает свойство члена id объекта не равно null или -1.

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

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

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

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

ответ

1

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

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

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

Смежные вопросы