Question

I have a h:commandLink inside rich:dataTable. When I click on the command link, I'm adding a FacesMessage to the context and redirecting to the same message. I have a h:messages tag on the page to display any faces messages. I am able to display the message, but I'm getting following warning and the messages are not getting cleared.

WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash. Any values stored to the flash will not be available on the next request.

I am using JSF2.0, RF4.0.0.Final. Following is the code

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:rich="http://richfaces.org/rich">
<h:head>
    <title>DataTable Test</title>
</h:head>
<h:body>
    <h:form prependId="false">
        <rich:panel header="Data table test">
            <br/><br/>
            <rich:dataTable id="dTable" value="#{myBean.allInventory}" var="inv" style="margin: auto; width: 100%; min-width: 750px;"
                            rows="10" onrowmouseover="this.style.backgroundColor='#A0A0A0'"
                            onrowmouseout="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Sl No" />
                    </f:facet>
                    <h:outputText value="#{inv.slno}" />
                </rich:column>
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Item 1" />
                    </f:facet>

                    <h:commandLink id="docMessage" title="Click for details" action="#{myBean.cLink(inv)}" value="#{inv.item1}"/>
                </rich:column>
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Item 2" />
                    </f:facet>
                    <h:outputText value="#{inv.item2}" />
                </rich:column>
                <f:facet name="footer">
                    <rich:dataScroller id="dataScroll" for="dTable"/>
                </f:facet>
            </rich:dataTable>

            <h:messages id="messages" globalOnly="true" layout="table" ></h:messages>
        </rich:panel>
    </h:form>
</h:body>

MyBean.java

package com.mypkg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named
@SessionScoped
public class MyBean implements Serializable {

private List<Inventory> allInventory = null;

/**
 * @return the allInventory
 */
public List<Inventory> getAllInventory() {
    if (allInventory == null) {
        allInventory = new ArrayList<Inventory>();
        for (int i = 0; i < 100; i++) {
            Inventory e = new Inventory();
            e.setSlno(i + 1);
            e.setItem1("Item1" + Math.random());
            e.setItem2("Item2" + Math.random());
            allInventory.add(e);
        }
    }
    return allInventory;
}

public String cLink(Inventory inv) {
    FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Sample Error Message", "Sample Error Message"));
    return "index?faces-redirect=true";
}

/**
 * @param allInventory the allInventory to set
 */
public void setAllInventory(List<Inventory> allInventory) {
    this.allInventory = allInventory;
}

}

Inventory.java

/* * To change this template, choose Tools | Templates * and open the template in the editor. */

package com.mypkg;

public class Inventory {

    private int slno;
    private String item1;
    private String item2;

    /**
     * @return the slno
     */
    public int getSlno() {
        return slno;
    }

    /**
     * @param slno the slno to set
     */
    public void setSlno(int slno) {
        this.slno = slno;
    }

    /**
     * @return the item1
     */
    public String getItem1() {
        return item1;
    }

    /**
     * @param item1 the item1 to set
     */
    public void setItem1(String item1) {
        this.item1 = item1;
    }

    /**
     * @return the item2
     */
    public String getItem2() {
        return item2;
    }

    /**
     * @param item2 the item2 to set
     */
    public void setItem2(String item2) {
        this.item2 = item2;
    }


}
Was it helpful?

Solution

This problem is related to the <rich:dataScroller> which you've there in your table footer. When I removed it, everything works as expected.

I checked around in RichFaces issue tracker if this bug is known, but it apparently isn't. You may want to consider to repost a minimal example of your code as you've in the question (several columns, headers and attributes are unnecessary and makes code unnecessarily large, so trim them away) in a new issue report over there.

OTHER TIPS

after long time debugging, I've found a 100% working solution for my case. Glassfish chunks the output stream and each chunk is commited separately. But after the first chunk is commited, the ELFlash implementation thinks, the whole response is commited and decides to fail...

After disabling chunking in glassfish, all problems are gone. http://www.dirkreske.de/jsf1095-with-glassfish-3-1/

Greets Dirk

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top