I have a problem with the validation of a <p:inputText>
and updating its content.
Basically when the inputText validation fails, it never gets updated again.
Here's a simple example to clarify:
The Facelet:
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<body>
<h1>Test</h1>
<h:form id="list" prependId="false">
<ul>
<li>Element 1 
<p:commandLink action="#{Test.assignElement}" update="detail_value">
<f:setPropertyActionListener target="#{Test.currentElement}" value="1" />
Assign
</p:commandLink>
</li>
<li>Element 2 
<p:commandLink action="#{Test.assignElement}" update="detail_value">
<f:setPropertyActionListener target="#{Test.currentElement}" value="2" />
Assign
</p:commandLink>
</li>
</ul>
</h:form>
<h:form id="detail" prependId="false">
<p:inputText value="#{Test.element}" id="detail_value" required="true" styleClass="#{Faces.messagesFor['detail_value'] ? 'border:1px solid red' : ''}">
<p:ajax event="blur" update="detail_value"></p:ajax>
</p:inputText>
</h:form>
</body>
</html>
The Test bean:
package com.easydevel.test;
public class Test {
private String currentElement;
private String element;
public String getCurrentElement() {
return currentElement;
}
public void setCurrentElement(String currentElement) {
this.currentElement = currentElement;
}
public String getElement() {
return element;
}
public void setElement(String element) {
this.element = element;
}
public String assignElement(){
setElement(getCurrentElement());
return "";
}
}
If you click on the commandLinks below the "Element"s the input field gets updated, but when a validation fails (simply leave the input text blank, and click on any other part of the page), the border of the input turns red. After that it never gets updated again when clicking on the above mentioned commandLinks.
Any ideas?
Arjan tijms answer will works, however the best solutions I found are:
Use Omnifaces Solution So, instead of implementing the listener your self all what you need is just one line of simple code.
If you are using Primefaces you can use resetInput component:
I will answer myself.
Based on the links provided by Arjan, i develop the actionListener to clean the form elements. and It works.
THE FACELET:
And the LISTENER....
This is the notorious case of 'input elements' (
EditableValueHolder
s actually) that once validation has failed for them can never be updated again via AJAX re-rendering.See:
A work-around is to create an action listener that resets the components that are to be re-rendered. See the last page of this: http://community.jboss.org/message/620000
If this behavior bothers you (I guess it does), then please don't hesitate to vote for JAVASERVERFACES_SPEC_PUBLIC-1060 and if possible leave a comment telling what you expected and why.