I took a look into the code to make sure I knew what was going on and here is what I found:
It looks like the problem you are having is due to the design of the ValidateEqual class. It is performing its logic in the validation phase using the EditableValueHolder.getValue() function. This presents a problem on the first component. Reason as follows: "equal" has an EqualValidator added to it during the view creation "equal2" has an EqualValidator added to it during the view creation during the decode phase, equal and equal2 are decoded and the values from the client are stored in the submittedValue property of each component. during the validation phase: The "equal" component's processValidators method calls the validate function. This function converts the submitted value. If there are no problems, the validation of the component is called (validateValue function). If the component is valid, the local value (setValue) is called. So, at the time that the "equal" is validating, equal2 has not set its local value (it is currently null, only the submitted value is set) and the submitted value is not converted. So, equal cannot compare it's local value to equal2's local value since equal2 is not yet validated. This means that in order for the validate compare to and validate equal components to work, they have to be on the second component as the first component has to be already be validate, and be valid! Otherwise, the local value is not set, which is what these validators use to validate against. So the short answer to your question is your use case is not supported. The validators *have* to be only on the 2nd component. -Andrew On 9/4/07, Suhel Rizvi <[EMAIL PROTECTED]> wrote: > > I agree with you but unfortunately the customer for whom I'm developing the > software doesn't, but additionally the problem in itself is something we > should be able to solve relatively simply I would have thought as it may be > a valid scenario in other software projects. > > >From: "Andrew Robinson" <[EMAIL PROTECTED]> > >Reply-To: "MyFaces Discussion" <[email protected]> > >To: "MyFaces Discussion" <[email protected]> > >Subject: Re: [Tomahawk] validateEqual problem for second field > >Date: Tue, 4 Sep 2007 10:41:39 -0600 > > > >Not a solution but a question, > > > >why have the validate equal on both components, it should only be > >necessary to put it on one of the components (like the 2nd one). The > >user shouldn't need two messages telling them they screwed up, one > >should be necessary :-) > > > >-Andrew > > > >On 9/4/07, Suhel Rizvi <[EMAIL PROTECTED]> wrote: > > > > > > I am using the tomahawk validateEqual tag to check if two (non > >mandatory) > > > fields on a form are equal to each other but hitting some problems > >related > > > to the order of the field validations. > > > > > > In the example below the validation and error message attached to the > >second > > > field works fine. However for the validation on the first field it seems > >I > > > have to submit the form the fields are in twice if the fields are equal > >- > > > the first time it always displays the error message saying they are > >unequal > > > but seems to realize they are equal on second submit. > > > > > > <h:inputText id="equal" > > > value="#{validateForm.equal}" > > > required="false"> > > > <t:validateEqual for="equa2l" /> > > > </h:inputText> > > > <h:inputText id="equal2" > > > value="#{validateForm.equal2}" > > > required="false"> > > > <t:validateEqual for="equal" /> > > > </h:inputText> > > > > > > Does anyone know why this is happening or have a solution ? > > > > > > [I have also tried the sandbox validateCompareTo tag as an alternative > >with > > > similar results.] > > > > > > _________________________________________________________________ > > > Get Pimped! FREE emoticon packs from Windows Live - > > > http://www.pimpmylive.co.uk > > > > > > > > _________________________________________________________________ > Get Pimped! FREE emoticon packs from Windows Live - > http://www.pimpmylive.co.uk > >

