Я определил раздел f: metadata на моей странице xhtml, как показано ниже, с помощью f: viewParam , как показано в приведенном ниже фрагменте:

<html xmlns="http://www.w3.org/1999/xhtml" (...)>

<f:metadata>
    <f:viewParam name="cust-id" value="#{CustomerCEVController.customer}" 
        converter="#{customerConverter}" converterMessage="blah blah."
        required="false"
    />
</f:metadata>


    <ui:composition template="/templates/commonLayout.xhtml">
        <ui:define name="title">
        (...)
        <ui:define name="body">
        (...)

.. и объявили класс CustomerConverter для параметра cust-id . В поле ПРОЦЕСС ПРОВЕРКИ . Этап жизненного цикла JSF называется ПЕРЕД методом установки для поля customer , который вызывается в жизненном цикле ОБНОВЛЕНИЕ ЗНАЧЕНИЙ МОДЕЛИ . фаза. В результате во время вызова геттера поле не инициализируется преобразователем должным образом. Таким образом, последовательность выглядит так (где CustomerCEVController - это вспомогательный класс bean-компонента):

[ НАЧАЛО ФАЗА ПРОВЕРКИ ПРОЦЕССА ]
[Вызывается CustomerConverter # getAsObject]
[Вызывается CustomerCEVController # getCustomer]
[ Фаза ПРОВЕРКИ ПРОЦЕССА КОНЕЦ ]
[ НАЧАЛО ОБНОВЛЕНИЯ МОДЕЛЬНЫХ ЗНАЧЕНИЙ ]
[CustomerCEVController # setCustomer called]

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

1
Marcus Junius Brutus 2 Авг 2012 в 14:48

1 ответ

Лучший ответ

Последовательность абсолютно прекрасна. Я не понимаю, почему именно это создает для вас проблему. Возможно, вы занимаетесь какой-то бизнес-работой в геттере или сеттере, в то время как это вообще не относится к этим методам? Вместо этого вам понадобится <f:event type="preRenderView"> для выполнения этой бизнес-работы.

Получатель вызывается в конце фазы проверки, потому что в этот момент будет принято решение о публикации ValueChangeEvent или нет. Для этого необходимо начальное («старое») значение, которое затем будет сравниваться с отправленным / преобразованным / подтвержденным («новым») значением. Если эти значения не равны, то оба будут переданы как «старое» и «новое» значение опубликованного ValueChangeEvent.

4
BalusC 2 Авг 2012 в 18:23