Предупреждение JSF1095 при использовании ah: commandLink внутри rich: dataTable - PullRequest
1 голос
/ 09 сентября 2011

У меня есть h:commandLink внутри rich:dataTable. Когда я нажимаю на ссылку команды, я добавляю FacesMessage в контекст и перенаправляю на то же сообщение. У меня есть тег h:messages на странице для отображения сообщений о лицах. Я могу отобразить сообщение, но получаю следующее предупреждение, и сообщения не очищаются.

ПРЕДУПРЕЖДЕНИЕ: JSF1095: Ответ уже был принят к тому времени, когда мы попытались установить исходящий файл cookie для флэш-памяти. Любые значения, сохраненные во флэш-памяти, не будут доступны при следующем запросе.

Я использую JSF2.0, RF4.0.0.Final. Ниже приведен код

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

/ * * Чтобы изменить этот шаблон, выберите Инструменты | Шаблоны * и откройте шаблон в редакторе. * /

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;
    }


}

Ответы [ 2 ]

1 голос
/ 07 октября 2011

после долгой отладки я нашел 100% работающее решение для моего случая.Glassfish разделяет выходной поток, и каждый кусок фиксируется отдельно.Но после того, как первый чанк был зафиксирован, реализация ELFlash думает, что весь ответ фиксируется и решает потерпеть неудачу ...

После отключения чанкинга в glassfish все проблемы исчезают.http://www.dirkreske.de/jsf1095-with-glassfish-3-1/

Привет, Дирк

1 голос
/ 09 сентября 2011

Эта проблема связана с <rich:dataScroller>, который находится в нижнем колонтитуле таблицы.Когда я его убрал, все работает как положено.

Я проверял в Отслеживание проблем RichFaces , если эта ошибка известна, но, по-видимому, нет.Возможно, вы захотите опубликовать минимальный пример кода, который вы задали в вопросе (несколько столбцов, заголовков и атрибутов не нужны и делают код чрезмерно большим, поэтому обрежьте их) в новом отчете о проблемах.

...