Leonardo,

I disabled partial state saving, and everything works as expected. I had also previously tried using the same snippet in a JSP and it worked ok there as well. So the problem is definitely only occurring with partial state saving enabled.

I'm not sure I follow how the binding attribute would come into play in this scenario. The value change listener is being engaged ok. In fact, the problem seems to be occurring well before that listener is engaged. The component's restoreState method is never actually being called, so when the value change listener is getting called during validation, its being passed the original value from the page, not the updated value that should have been restored from the previous state.
-Mike

Leonardo Uribe wrote:
Hi

2009/10/20 Michael Concini <[email protected] <mailto:[email protected]>>

    All,

    I've run into what appears to be a bug in the new state
    saving/restoring code for facelets.
    I've got a simple xhtml page with a one field form and a value
    change listener attached.  The listener simply outputs the old
    value and the new value to SystemOut.  On every postback, its
    showing the old value as what was originally set by the 'value'
    attribute and not the value from the previous request as would be
    expected.
    <h:form id="form1">
        <h:commandButton value="Press here" id="testListeners" />
        <h:inputText id="testValueChangeListener" value="some text">
              <f:valueChangeListener
    binding="#{coreTagsBean.testValueChangeListener}"
    type="listener.TestValueChangeListener" />
          </h:inputText>
    </h:form>

    I stepped through the code in the debugger, and when we get into
    DefaultFaceletsStateManagementStrategy.restoreView(), the states
    are always coming up null in the return object array returned form
    the HtmlResponseStateManager from this code snippet (lines 160-161
    in my view)

          state = (Object[]) manager.getState (context, viewId);
          states = (Map<String, Object>) state[1];

    Since states is null, when we execute restoreStateFromMap(), we
    don't ever execute the restoreState() method on the component
    since we have not recovered the state data.

    I've stepped through the code for state saving, and it looks to me
    as though the state data for the input text field is being saved
    properly, but I'm not very familiar with how the state
    saving/restoring code works.  I'd be happy to continue doing the
    debugging if someone could point me in the right direction, but I
    would appreciate any help from those in the community who are more
    familiar with the state management code.


The first part works as expected (state=null). For partial state saving, the component tree is built on every request. If nothing changes, no state is saved for the component. In jsf 2.0, there was some changes related to the behavior of binding attribute, so maybe it is related to this one. It could be good to test is without partial state saving, to see how it should behave.

regards,

Leonardo Uribe
    Thanks,
    Mike



Reply via email to