[richfaces-issues] [JBoss JIRA] (RF-12831) <rich:validator/> performs ajax validation without updating underlying model field

Kamil Roman (JIRA) jira-events at lists.jboss.org
Wed Mar 27 19:17:41 EDT 2013


     [ https://issues.jboss.org/browse/RF-12831?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Kamil Roman updated RF-12831:
-----------------------------

    Attachment: rf-12831.zip


Hi Juraj,

I am attaching a maven project illustrating and reproducing the issue. The validation method fragment with the comment is the best explanation
{code}
public void validateField1(FacesContext context, UIComponent toValidate, Object value) {
		
		System.out.println("argument value: " + value);
		System.out.println("model value: " + model.getField1());
		//my expectation is that value is equal to associated model field - validation should be performed after applying request values.
		//If it is not the code will throw RuntimeException
		
		if (!model.getField1().equals(value)) {
			throw new RuntimeException("value passed to the validation method should be equal to the associated model field!");
		}
		
		//this would be a workaround to the bug
		model.setField1((String) value);
		
		//validation logic omitted
	}
{code}

To reproduce the issue with the code attached:
# Unzip the file attached.
# run maven install
# deploy manually the resulting target/rf-12831.war to JBoss server.
# navigate to http://localhost:8080/rf-12831/app/pages/addModel.xhtml (assuming your JBoss listens on localhost:8080)
# Change value in field1 textbox.
# Click on field2 textbox.
# RuntimeException is thrown (manually from the validation method, see code and comment above).
                
> <rich:validator/> performs ajax validation without updating underlying model field
> ----------------------------------------------------------------------------------
>
>                 Key: RF-12831
>                 URL: https://issues.jboss.org/browse/RF-12831
>             Project: RichFaces
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 4.3.0.Final
>         Environment: JBoss eap 6.0.0, Win 7
>            Reporter: Kamil Roman
>            Assignee: Juraj Húska
>            Priority: Minor
>              Labels: waiting_on_user
>         Attachments: rf-12831.zip
>
>
> Not sure if it's a bug or a feature, but field annotated with {code}<rich:validator/>{code} with a validation method set with {code}validator{code} attribute gets validated without updating the underlying model field. My code is something like this:
> {code:title=Model.java}
> public class Model {
> //...
> public Date getValidFrom() {/*...*/}
> public Date getValidTo() {/*...*/}
> }
> {code}
> {code:title=ModelValidator.java}
> public class ModelValidator{
> private Model model;
> public boolean isValidToAfterValidFrom() {
> 	return model.getValidTo().after(model.getValidFrom());		
> 	}
> }
> {code}
> {code:title=model_form.xml}
> <c:set var="model" value="#{ModelBean.model}"/>
> <h:outputLabel value="#{labels.getLabel('valid_from')}"	for="validFrom" /> 
> <rich:calendar	value="#{model.validFrom}" id="validFrom" >
> 	<rich:validator/>
> </rich:calendar>
> <rich:message for="validFrom"/>	
> 									
> <h:outputLabel value="#{labels.getLabel('valid_to')}" for="validTo" /> 
> <rich:calendar value="#{model.validTo}" id="validTo" validator="#{modelBean.validateValidTo}">
> 	<rich:validator event="inputblur"/>
> </rich:calendar>
> <rich:message for="validTo"/>
> {code}
> {code:title=ModelBean.java}
> public class ModelBean {
> public Model getModel() {/*..*/}
> private ModelValidator validator;
> //...
> public validateValidTo(FacesContext context, UIComponent toValidate, Object value) {
> 	if(!validator.isValidToAfterValidFrom()) {
> 		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, labelBean.getLabel("valid.to.not.after.valid.from.error"), null);
> 		throw new ValidatorException(message);
> 	}
> }
> {code}
> The getModel() method returns the same Model instance as is used by the ModelValidator in ModelBean.
> Now, the testcase is:
> 1. User selects validTo earlier than ValidFrom (on a valid Model instance)
> 2. Validation passes as the underlying model value is not updated (validator refers to the same Model instance as ModelBean)
> 3. User submits the form.
> 4. System displays error message as server-side validation on submit is performed after applying request values.
> 5. User corrects the value in validTo field.
> 6. System still displays error message as validation fails, because the new value is not applied to the model (model holds the invalid value applied during failed submit).
> If this is not a bug, but a feature, it would be great if you included this behaviour in the docs!

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira



More information about the richfaces-issues mailing list