Mike Kienenberger wrote:
A) First request -- generated html created
B) modify form, hit submit.   Form values created.
C) second request - component tree restored, form values matched with
component tree ids.

Please double and triple-check that the form values created in B are
different than the names/ids generated in A.   I can think of no
reason why this would happen.

You are correct; there is no difference from A to B. Evidently I copied the component names I sent earlier from a page which had been re-rendered. Sorry about that. The component names in the originally generated page source match the names logged by my filter eg:

mainForm:contentPanel_209:contentPanel_314:editableAnecdotalComment548806167

One additional thing that seems odd. When I described the containment previously, I forgot about a couple of layers. The component path that the warning generates doesn't seem to jive with the component name. I don't know if this is an issue at all, but I expected there to be more correspondence. I also didn't expect to see something with a null id in the mix.

2007-06-11 15:41:57,140 WARN  - There should always be a submitted value ...
[Class: javax.faces.component.UIViewRoot,ViewId: /pages/reportCard.jsp]
[Class: javax.faces.component.html.HtmlForm,Id: mainForm]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: detailPanel]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: contentPanel]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane,Id: _id0]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTab,Id: _id6]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: null]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane,Id: _id7]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTab,Id: _id9]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: anecdotalCommentPanelGrid5488061672] [Class: javax.faces.component.html.HtmlInputTextarea,Id: editableAnecdotalComment548806167]



If the difference is not until C, I can think of a possibility.

binding="#{reportCardBean.mainPanel}"

What scope is reportCardBean?

Request. Since it is so easy to change, I naively tried out a session scoped version, but it had the same problems. It's been request scoped for it's whole life though, including versions that worked (IIRC request scope is recommended).

If the original component is lost, and you bind it to a new component
(probably completely auto-generated, giving the _id* values that we
saw before), then this would explain why the submitted form values can
no longer be matched up to the newly-created component paths in C.

I'm not sure I follow. Despite my previous misleading mail, subsequent versions of the page (I can't navigate away from it once it's been opened) also have a correspondence between component names and request parameters albeit with generated names like:

mainForm:_id6:_id9:editableAnecdotalComment548806167

The component path though seems very consistent with the previous rendering: (only generated id's differ)

[Class: javax.faces.component.UIViewRoot,ViewId: /pages/reportCard.jsp]
[Class: javax.faces.component.html.HtmlForm,Id: mainForm]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: detailPanel]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: contentPanel]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane,Id: _id51]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTab,Id: _id57]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: null]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane,Id: _id58]
[Class: org.apache.myfaces.custom.tabbedpane.HtmlPanelTab,Id: _id60]
[Class: javax.faces.component.html.HtmlPanelGrid,Id: anecdotalCommentPanelGrid5488061672] [Class: javax.faces.component.html.HtmlInputTextarea,Id: editableAnecdotalComment548806167]

Thanks for sticking with me, I owe you a case of virtual beer!

Shane


On 6/11/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
Mike Kienenberger wrote:
> I'm confused.

That's good, at least I have some company!  :)

> Clearly, something has changed from the time it was sent to the
> browser (generated html) and the time it was received from the browser
> (submitted values).

That's what seems to be the case.

> Also, if the generated html has _id30, clearly there is no explicit
> name for contentPanel.
This particular panel is one of the few things named in the jsp

<h:panelGrid id="contentPanel" binding="#{reportCardBean.mainPanel}"
                   columns="1" border="1" width="100%" cellspacing="0"
styleClass="panel"/>

(It's name used to be 'mainPanel' to better match the binding, but it an
effort to ensure that caching wasn't an issue, I renamed it)

> a) create a simplified example showing the problem, or

If only I'd looked into Selenium earlier, I might have become aware of
the time at which the problem was introduced... I only see the issue
once things are large.

> b) post your page code, the generated html, and the form-value pairs
> submitted afterward.
I don't know how much good the creation code would be, since execution
paths through it all depend on the metadata coming out of the database
(the components added to the page depend on context like the user
viewing the page and the attributes of the person being represented on
the page). I'll send a copy of the generated html shortly (I have reams
of stuff commented out right now to try to isolate the issue).

Is there any upper limit to the number of components which can reliably
be rendered? One of the things that my users have requested is lots of
contextual information, as a result, this page has grown huge. The
reason I ask is that the discrepancy between id and request params is
not the only problem. I commented out the code which creates the text
areas which the warnings complain about, but my navigation issues were
still not fixed. I can successively comment things out to get back to a
point where navigation functions again, but I haven't yet tracked down
the code which kills things (it seems to be in 2 areas). For now, I'm
working under the rather baseless assumption that the 2 problems are
interrelated.

Thanks for your efforts so far.

Shane

>
> On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> Mike Kienenberger wrote:
>> > So the question is why does _id30 get translated to contentPanel_1153
>> > and _id33 get translated to contentPanel_1344 on submit?
>> >
>> That would be the question alright... It seems as though the problem
>> actually happens before/during html generation. On submit, it's too
>> late.
>>
>> > It looks like you've went from automatically generated ids for these >> > components to explicitly-set (plus some random number) ids for these
>> > components.
>> The parameter map seems like it is the correct one. The text areas in
>> question sit in tabs located on 'mainForm'. Specifically the containment
>> looks like:
>>
>> mainForm (explicitly named)
>>     contentPanel (explicitly named)
>>         Tab_1 (generated id)
>>                 Panel_1 (generated id)
>> editableAnecdotalComment548806536 (explicitly named
>> - the numbers at the end refer to a db id)
>>
>> Shane
>> >
>> >
>> > On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> At the point where the warning is logged,
>> >> component.getClientId(FacesContext) doesn't return a value
>> contained in
>> >> the request parameter map. While that's good for me to know, I'm
>> >> guessing you guys already knew that :) What could cause the mismatch?
>> >> Thanks in advance.
>> >
>> > On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> Mike Kienenberger wrote:
>> >> > Another way would be to set a breakpoint somewhere and
>> >> > check what's in the request parameter map for the current request.
>> >> OK, what I've done is to add a Servlet Filter to the mix (in
>> looking at
>> >> example code, it seems that the filter may come in handy down the
>> line).
>> >> What I figured was that the filter will get processed early, and is
>> >> therefore a good place to set a breakpoint to examine request
>> >> parameters. (Although as I write this I'm wondering about filter
>> >> ordering and the Extensions filter) It seems as though the component
>> >> id's do not correspond to the request parameters which make it
>> through
>> >> to the filter. In the generated html I have
>> >>
>> >> id="mainForm:_id30:_id33:editableAnecdotalComment548806536"
>> >>
>> >> and in the request I have
>> >>
>> >> param:
>> >>
>> mainForm:contentPanel_1153:contentPanel_1344:editableAnecdotalComment548806536,
>>
>> >>
>> >>
>> >> value: [Ljava.lang.String;@1fff293
>> >>
>> >> The "editableAnecdotalComment548806536" portion is the ID that I set. >> >> All of the _idXX components get mapped to different parameter names
>> >> (contentPanel happens to be the name I assigned to the main panel
>> on the
>> >> jsp page whose binding attribute I use to build up dynamic content).
>> >> Since all component id's get mapped, I don't yet see a problem. I
>> >> haven't tried stepping into anything outside my own code yet, but I
>> >> guess that's next on the list.
>> >>
>> >> Shane
>> >>
>> >> > You can save the generated html to a file and manually change
>> the url
>> >> > to something else that will trap and log the values.
>> >> >
>> >> > Lots of different options, but the key is to verify that there
>> is no
>> >> > value being submitted for your component, which is what the error
>> >> > message is claming.
>> >> >
>> >> > On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> >> Mike Kienenberger wrote:
>> >> >>
>> >> >> > If there's no such element, then you need to figure out why the
>> >> >> > element wasn't rendered.
>> >> >> I guess I wasn't clear. The components in question are in the
>> >> generated
>> >> >> html. They are enabled and rendered and I can't find anything
>> which
>> >> >> might potentially disable them via javascript. Certainly none
>> of the
>> >> >> javascript that I input will do this and I don't see any in the
>> >> >> generated javascript which might either.
>> >> >>
>> >> >> > If so, then you need to figure out why there's no submitted
>> >> value when
>> >> >> > you submit the form -- perhaps submitting the form through some
>> >> kind
>> >> >> > of proxy which logs all of the values would help.
>> >> >> OK, can you expand on this a bit? Do you mean some 'off the shelf'
>> >> proxy
>> >> >> or something different? This is what I was getting at with the
>> >> >> PhaseListener, if I could see what was actually making it
>> through, I
>> >> >> might be able to make some sense of what's going on.
>> >> >>
>> >> >> Shane
>> >> >>
>> >> >> >
>> >> >> > On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> >> >> Mike Kienenberger wrote:
>> >> >> >> > Set a breakpoint on the line generating the error.
>> >> >> >> > Your first step is to determine which component value is
>> missing
>> >> >> from
>> >> >> >> > your form submit.
>> >> >> >> According to the warning message, I can see that there are
>> several
>> >> >> text
>> >> >> >> area components which are the problem (I assign the id's
>> myself,
>> >> >> so it
>> >> >> >> is easy to verify which components it is complaining about).
>> Most
>> >> >> of the
>> >> >> >> components in this page are generated in java code, and
>> everything
>> >> >> looks
>> >> >> >> fine inside the factory method responsible for creating the
>> text
>> >> >> >> components (isDisabled()==false and isRendered()==true).
>> Visually,
>> >> >> >> immediately preceding an attempt to navigate away from this
>> >> page via
>> >> >> >> CommandLink, the fields in question are rendered and enabled.
>> >> After
>> >> >> >> that, I can see my request scoped backing bean get created once
>> >> >> the link
>> >> >> >> is clicked, but then the warnings are thrown and no navigation
>> >> takes
>> >> >> >> place. In terms of the generated html, it is a monsterous form
>> >> with
>> >> >> >> scads of disabled components, so it is not terribly easy to
>> verify
>> >> >> >> anything (my javascript skills suck as well, and that doesn't
>> >> help).
>> >> >> >> However, everything which gets disabled is set inside the java
>> >> code
>> >> >> >> which generates all of the content for the main panel so there
>> >> >> ought not
>> >> >> >> to be any issues with client side disables.
>> >> >> >>
>> >> >> >> > Once you know that, look at the generated html before the
>> submit
>> >> >> and
>> >> >> >> > see if you can determine why the input for that component
>> didn't
>> >> >> >> > submit a value.
>> >> >> >> OK, what do I look for? I know the component id a priori, so
>> I can
>> >> >> >> isolate the 3 times which it occurs in the generated html. Once
>> >> >> for the
>> >> >> >> component name, once for the id, and once in some javascript
>> tied
>> >> >> to a
>> >> >> >> sepeate button which does a spell check on the component in
>> >> question
>> >> >> >> (fwiw, the spell check function does not alter either the
>> >> rendered or
>> >> >> >> disabled state of the component and this issue crops up
>> >> regardless of
>> >> >> >> whether or not the spell check function is actually invoked)
>> >> >> >>
>> >> >> >> I don't see anything in the html which suggests a problem,
>> but I'm
>> >> >> not
>> >> >> >> altogether sure what to look for.
>> >> >> >>
>> >> >> >> Shane
>> >> >> >>
>> >> >> >> >
>> >> >> >> > On 6/8/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> >> >> >> Thanks for the suggestions,
>> >> >> >> >>
>> >> >> >> >> In reviewing the potential problems you listed below, I'm
>> still
>> >> >> >> stuck. I
>> >> >> >> >> don't use ajax, so 1) shouldn't be an issue. I don't disable
>> >> >> >> anything in
>> >> >> >> >> javascript, so 2) shouldn't affect me. I only use a
>> single form
>> >> >> with
>> >> >> >> >> everything inside it, so 3) shouldn't be an issue either.
>> And I
>> >> >> don't
>> >> >> >> >> tie any EL to the disabled/rendered properties (only the
>> >> value is
>> >> >> >> >> mutated via EL expression).
>> >> >> >> >>
>> >> >> >> >> What do you think would be the best way to diagnose what is
>> >> going
>> >> >> >> wrong?
>> >> >> >> >> I guess I could attach a PhaseListener and set a
>> breakpoint in
>> >> >> >> there to
>> >> >> >> >> try to dissect what JSF thinks is wrong. I'm at a real loss
>> >> here
>> >> >> >> since I
>> >> >> >> >> can't see anything wrong and the components which are
>> >> causing the
>> >> >> >> >> problem are used to capture the most important data I deal
>> >> with.
>> >> >> >> Thanks
>> >> >> >> >> for the help
>> >> >> >> >>
>> >> >> >> >> Shane
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> Andrew Robinson wrote:
>> >> >> >> >> > That error occurs if there is no submitted value (I know -
>> >> >> obvious
>> >> >> >> >> > statement). Several things can cause it though. Here
>> are the
>> >> >> >> ones that
>> >> >> >> >> > are most common IMO (P -> problem,
>> S->Work-around/Solution)
>> >> >> >> >> >
>> >> >> >> >> > 1) (P) A4J and the ajaxSingle attribute set to true.
>> (S) Use
>> >> >> >> >> > a4j:region around any component with ajaxSingle set to
>> true
>> >> >> to make
>> >> >> >> >> > sure only that component is decoded and updated
>> >> >> >> >> >
>> >> >> >> >> > 2) (P) Element is removed from the client DOM or is
>> disabled
>> >> >> >> *and* the
>> >> >> >> >> > JSF component is not disabled. (S) The client side
>> >> >> enabled/rendered
>> >> >> >> >> > should map to the server-side enabled/rendered.
>> Therefore, if
>> >> >> >> you are
>> >> >> >> >> > disabling/removing components on the client, you need
>> to make
>> >> >> >> sure you
>> >> >> >> >> > change the value on the server *before* the apply request
>> >> values
>> >> >> >> phase
>> >> >> >> >> > (I think that is the correct phase of the error).
>> >> >> >> >> >
>> >> >> >> >> > 3) (P) Component is not inside of the form that was
>> >> submitted.
>> >> >> >> (S1) Do
>> >> >> >> >> > not use multiple forms if doing so, instead use the
>> subForm
>> >> >> >> component
>> >> >> >> >> > in the sandbox with one form or use one or multiple forms
>> >> with
>> >> >> >> >> > a4j:region if using A4J. (S2) make sure all components
>> that
>> >> >> >> implement
>> >> >> >> >> > EditableValueHolder are placed inside of a UIForm
>> component.
>> >> >> >> >> >
>> >> >> >> >> > 4) (P) The EL expression tied to the rendered or disabled
>> >> >> >> property of
>> >> >> >> >> > the component is not view specific and has been changed by
>> >> >> another
>> >> >> >> >> > view or is changed before the apply request values
>> phase. (S)
>> >> >> Make
>> >> >> >> >> > sure the rendered and/or disabled properties of
>> components do
>> >> >> not
>> >> >> >> >> > change after rendering and before the apply request
>> values.
>> >> >> >> >> >
>> >> >> >> >> > -Andrew
>> >> >> >> >> >
>> >> >> >> >> > On 6/5/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> >> >> >> >> Mike Kienenberger wrote:
>> >> >> >> >> >> > I've also had it happen if the page changes and the
>> >> facelets
>> >> >> >> >> component
>> >> >> >> >> >> > tree (or jsp page) is still cached somewhere.
>> >> >> >> >> >> I'm almost completely certain it is not a caching issue
>> >> >> >> (although it
>> >> >> >> >> >> would be good to know if one could configure Tomcat
>> not to
>> >> >> cache
>> >> >> >> >> >> anything, ever...) I've hand nuked caches several
>> times and
>> >> >> tried
>> >> >> >> >> >> executing on a different machine (Tomcat running on the
>> >> >> >> localhost in
>> >> >> >> >> >> both cases).
>> >> >> >> >> >>
>> >> >> >> >> >> Shane
>> >> >> >> >> >> >   Same idea -- the
>> >> >> >> >> >> > expected submitted page elements do not match the
>> actual
>> >> >> >> submitted
>> >> >> >> >> >> > page elements.
>> >> >> >> >> >> >
>> >> >> >> >> >> > On 6/5/07, Shane Petroff <[EMAIL PROTECTED]> wrote:
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> I am having some strange navigation problems (once
>> >> again...)
>> >> >> >> >> and the
>> >> >> >> >> >> >> only clue I have is the warning below.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> HtmlRendererUtils - There should always be a submitted
>> >> value
>> >> >> >> >> for an
>> >> >> >> >> >> >> input if it is rendered, its form is submitted, and
>> it is
>> >> >> not
>> >> >> >> >> >> disabled
>> >> >> >> >> >> >> or read-only.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> In Googling the error message, it seems that the
>> problem
>> >> >> >> should be
>> >> >> >> >> >> >> related to using Javascript to disable a control which
>> >> >> my-faces
>> >> >> >> >> >> expects
>> >> >> >> >> >> >> to get a value from. The warning goes on to name the
>> >> >> >> component in
>> >> >> >> >> >> >> question, but there isn't any Javascript which touches
>> >> these
>> >> >> >> text
>> >> >> >> >> >> areas,
>> >> >> >> >> >> >> in fact there isn't any Javascript which disables
>> >> >> anything. The
>> >> >> >> >> >> >> components which are (in theory) causing the
>> warning are
>> >> >> >> certainly
>> >> >> >> >> >> not
>> >> >> >> >> >> >> disabled visually and for the most part they all
>> contain
>> >> >> text.
>> >> >> >> >> >> They also
>> >> >> >> >> >> >> happen to be created in Java code, so there is no
>> jsp to
>> >> >> post
>> >> >> >> >> here.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> Can anyone give me a more detailed interpretation
>> of what
>> >> >> the
>> >> >> >> >> warning
>> >> >> >> >> >> >> means and when it arises?
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> --
>> >> >> >> >> >> >> Shane
>> >> >> >> >> >> >>
>> >> >> >> >> >> >>
>> >> >> >> >> >> >
>> >> >> >> >> >>
>> >> >> >> >> >>
>> >> >> >> >> >> --
>> >> >> >> >> >> Shane
>> >> >> >> >> >>
>> >> >> >> >> >>
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> --
>> >> >> >> >> Shane
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >
>> >> >> >>
>> >> >> >>
>> >> >> >> --
>> >> >> >> Shane
>> >> >> >>
>> >> >> >>
>> >> >> >
>> >> >>
>> >> >>
>> >> >> --
>> >> >> Shane
>> >> >>
>> >> >>
>> >> >
>> >>
>> >>
>> >> --
>> >> Shane
>> >>
>> >>
>> >
>>
>>
>> --
>> Shane
>>
>>
>


--
Shane





--
Shane

Reply via email to