Проверять произвольные объекты в JSF? - PullRequest
2 голосов
/ 16 января 2012

Таким образом, вы можете проверить ввод, используя аннотации 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>

Или:

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

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

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

...
<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 и добавить скрытый ввод для включения проверки наid:

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

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

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

1 Ответ

1 голос
/ 04 июня 2012

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

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

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

...