Сеттеры вызываются дважды в управляемом бине JSF - PullRequest
0 голосов
/ 09 ноября 2011

У меня возникла проблема с применением дат к моему managedBean, поскольку я добавил jquerys datePicker в приложение.

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


myBean.java

public class MyBean {

    private Date startDate;
    private Date endDate;

    public MyBean()
    {
        ...
    }

    public void filterList()
    {
        ...
    }

    public Date getStartDate()
    {
        return startDate;
    }

    public void setStartDate(Date startDate)
    {
        this.startDate = startDate;
    }

    public Date getEndDate()
    {
        return endDate;
    }

    public void setEndDate(Date startDate)
    {
        this.endDate = endDate;
    }

}


myPage.xhtml:

<h:form id="my_requests_pending">
    <rich:panel id="filter_panel">
        <h:panelGrid rendered="#{myBean.filter}">
            <h:panelGrid>
                <h:outputText id="startDateLbl" value="#{messages['MyBeanMessages.startDate']}" />
                <h:panelGrid>                       
                    <h:inputText id="startDate" value="#{mysBean.startDate}">
                        <f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
                    </h:inputText>
                </h:panelGrid>
            </h:panelGrid>
            <h:panelGrid>
                <h:outputText value="#{messages['MyBeanMessages.endDate']}" />
                <h:panelGrid> 
                    <h:inputText id="endDate" value="#{myBean.endDate}">
                        <f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
                    </h:inputText>
                </h:panelGrid>
            </h:panelGrid>
        <h:panelGrid columns="1">
            <h:commandButton id="myReqSubmitBtn" value="#{messages['MyBeanMessages.submit']}" action="#{myBean.filterList}" />
        </h:panelGrid>
        </h:panelGrid>
    </rich:panel>
</h:form>


myCalendar.js

jQuery('startDate,endDate').datepicker.({
        showOn : 'both',
        changeMonth : true,
        changeYear : true,
        showOtherMonths : true,
        selectOtherMonths : true,
        showButtonPanel : true,
        dateFormat : "D, d M, yy",
        showAnim : "slideDown"
    });


Проблема возникает, когда я отправляю свою форму.

Методы setStartDate / setEndDate вызываются дважды (я вижу это в режиме отладки).
Первый раз правильно устанавливает дату на новую измененную дату, а второй вызов сбрасывает ее обратно надата рождения.

Что-то происходит с жизненным циклом JSF, о котором я не знаю?
Любая помощь приветствуется.

ОБНОВЛЕНИЕ

Кажется, проблема в фазе JSF «Обновление модели».Он выводит следующий код отладки:

09-Nov-2011 16:02:26 org.exadel.jsf.PhaseTracker beforePhase
INFO: BEFORE UPDATE_MODEL_VALUES 4
  • Затем он достигает точки останова в методе setStartDate () и корректно обновляет свойство startDate.
  • Когда он покидает метод setStartDate ()затем он выполняет многочисленные вызовы библиотек jsf и т. д. и снова возвращается к моей точке останова в setStartDate ()!
  • Затем я выхожу из метода и появляется следующий код отладки.
09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker afterPhase
INFO: AFTER UPDATE_MODEL_VALUES 4
09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker beforePhase
INFO: BEFORE INVOKE_APPLICATION 5

1 Ответ

0 голосов
/ 10 ноября 2011

В моей форме также был следующий код (устаревший код из предыдущей функциональности календарей).

<h:panelGrid id="hiddendates" styleClass="panelgrid-nopad"
                style="display:none">
                <h:outputText id="formId" value="#{formId}" />
                <h:inputText id="startDateHidden"
                    value="#{myRequestsBean.startDate}">
                    <f:convertDateTime pattern="dd/MM/yyyy"
                        timeZone="#{localeBean.timeZone}" />
                </h:inputText>
                <h:inputText id="endDateHidden" value="#{myRequestsBean.endDate}">
                    <f:convertDateTime pattern="dd/MM/yyyy"
                        timeZone="#{localeBean.timeZone}" />
                </h:inputText>
            </h:panelGrid>

Эти поля имеют идентификаторы 'startDateHidden' и 'endDateHidden'.
Поля сопоставлены с установщиками / получателями на основе значения el? (А не фактический идентификатор поля).

...