ConversationId in PageContext - FacesPage not cleared before redirect
ccurban Mar 25, 2008 1:31 AMHi,
I am using Seam 1.2.1, Myfaces 1.1.4 (facelets) and Richfaces 3.1.4 and am actually encountering a problem with using end-before-redirect and conversation propagation.
Here is what I do:
1. Show an object list backed by a SFSB and begin a long running conversation while creating the SFSB.
@Scope(ScopeType.CONVERSATION)
@Stateful
@Name("adjustInputAction")
public class AdjustInputAction implements AdjustInputLocal {
// List with all available customers
@DataModel
private List<Distribution> validateDistributionList;
.
.
@Begin
@Create
public void init() {
refreshList();
.
.
2. Select an object of the list and redirect to a second page backed by a Java Bean which joins the conversation
@Name("acquisitionAction")
@Scope(ScopeType.CONVERSATION)
public class AcquisitionAction {
// the selected distribution to show
@In(required = false, scope = ScopeType.CONVERSATION)
private Distribution selectedDistribution;
.
.
@Begin(join = true)
@Create
public void init() {
.
.
@End(beforeRedirect = true)
public String createOrder() {
.
.
3. Create an order and redirect back to the list page while ending the conversation before redirect. Therefore the list SFSB would be created in a new conversation and reload the list with the changes of step 3.
And here is my problem:
During step 3 I get an exception stating The conversation ended, timed out or was processing another request
.
And this is happening:
After the invocation of createOrder
the conversation is correctly destroyed and the redirect to my list page is executed (no Render-Response phase during this request).
In the second request SEAM tries to restore the conversation in Manager.restoreConversation
. Unfortunately Seam still finds the destroyed conversation due to the following lines
if ( isMissing(storedConversationId) )
{
if ( Contexts.isPageContextActive() )
{
//if it is not passed as a request parameter,
//try to get it from the page context
org.jboss.seam.core.FacesPage page =
org.jboss.seam.core.FacesPage.instance();
storedConversationId = page.getConversationId();
storedParentConversationId = null;
isLongRunningConversation =
page.isConversationLongRunning();
//if (isLongRunningConversation==null)
isLongRunningConversation = false;
}
}
Is this the intended behaviour? And if intended how can I really destroy the conversation before a redirect?
Thanks in advance
Christian