No rerender after validation failed
avi Dec 4, 2008 3:38 PMI have the following problem.
I have two required field x1 and x2 and a save button. On every change x.swap is called via a4j:support. If both field have not null value then swap swaps the value of the two field.
Everything works fine except there is a validation error. After that the fields are not rerendered.
Scenario: I write 1 into the first field (x1) then I click on save. Value is required message comes. Now I write 2 into the second field (x2). The x.swap is called and the second field is rerendered but the first field does not. It still shows 1 but the field x.x1 have the value 2. I debugged and x.getX1() is not even called after I clicked save.
In our project this happens everywhere where a field is calculated based on other fields. After a validation error these fields stop rerendering.
We use Seam 2.0.2.SP1 + JBoss 4.2.3.GA + RichFaces 3.2.2.SR1. But I tried different Seam and RichFaces versions and got the same result.
I ran out of any idea. So any help is appreciated.
Here is the x.xhtml
<!DOCTYPE composition 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:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">
<body>
<h:form>
<rich:messages></rich:messages>
<s:validateAll>
<h:inputText id="X1" value="#{x.x1}" required="true">
<a4j:support eventsQueue="queue" event="onchange" ajaxSingle="true"
action="#{x.swap}" reRender="X1,X2" />
</h:inputText>
<h:inputText id="X2" value="#{x.x2}" required="true">
<a4j:support eventsQueue="queue" event="onchange" ajaxSingle="true"
action="#{x.swap}" reRender="X1,X2" />
</h:inputText>
<a4j:commandButton value="save"
eventsQueue="queue" action="#{x.save}" reRender="X1,X2" />
</s:validateAll>
</h:form>
</body>
</html>And x.java
@Stateful
@Name("x")
@Conversational
public class X implements XLocal
{
private Integer x1;
private Integer x2;
@Begin
@Create
public void create()
{
}
public Integer getX1()
{
return x1;
}
public void setX1( Integer pX1 )
{
x1 = pX1;
}
public Integer getX2()
{
return x2;
}
public void setX2( Integer pX2 )
{
x2 = pX2;
}
public void swap()
{
if(x1==null || x2==null)
return;
Integer x = x1;
x1=x2;
x2=x;
}
public void save()
{
}
@Destroy
@Remove
public void destroy()
{
}
}