2011-09-09 323 views
1

h:commandLinkrich:dataTableです。コマンドリンクをクリックすると、FacesMessageをコンテキストに追加して、同じメッセージにリダイレクトします。ページにh:messagesというタグがあり、顔のメッセージを表示しています。メッセージを表示することはできますが、次の警告が表示され、メッセージはクリアされません。警告JSF1095は、rich:dataTable内でh:commandLinkを使用しています

警告:JSF1095:Flash用に送信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; 
    } 


} 
+0

にどのようなJSFのimpl /バージョンに挨拶?私のバグのように見えます。最新にアップグレードするか、implを置き換えてください。ちなみに、あなたはちょっと、「rich:dataTableのみ」で失敗していることを暗示していますが、これを確認できますか?私。コマンドリンクが 'rich:dataTable'の外に置かれても、完璧に動作しますか? – BalusC

+0

@BalusC JSF 2.0、JSTL 1.1(NetBeans 6.9.1に付属のフレームワーク)を使用しています。 'rich:dataTable'の外側にコマンドリンクを置いたとき、警告メッセージは表示されません。私はこれを 'のように追加し、' MyBean.java'では、同じボディを持つ 'linkTest()'メソッドを追加しましたメソッド 'cLink(Inventory inv) ' – Praneeth

+0

「JSF 2.0」は単なるスペックバージョンです。どのインプラント/バージョンを使用していますか?例えば、Mojarra 2.0.6?これは、サーバーの起動ログに表示されるか、JARを抽出してマニフェストファイルを読み込むことによって表示されます。問題に関しては、それは面白いです。'rich:xxx'の代わりに' h:dataTable'/'h:column'を使ってみることができますか?このようにして、標準のJSFまたはRichFacesを疑わしいものから除外できます。 – BalusC

答えて

1

この問題は、あなたのテーブルのフッターにありました<rich:dataScroller>に関連しています。私はそれを削除すると、すべてが期待どおりに動作します。

このバグがわかっている場合はRichFaces issue trackerでチェックしましたが、明らかにそうではありません。問題のようにコードの最小限の例を再投稿することを検討することができます(いくつかの列、ヘッダーと属性は不要でコードを不必要に大きくするため、削除してください)。

+0

ありがとう。私は必要な変更を加えてそれを再投稿します。 – Praneeth

+0

こんにちは、私はここにそれを再ポストすることを意味しませんでしたが、RichFacesのissue trackerにあります:)私の答えのリンクをクリックしてください。 – BalusC

+0

おっと、申し訳ありません。 RichFacesのissue trackerに投稿します。 – Praneeth

1

私は長い時間のデバッグの後、私は私の場合のための100%の作業ソリューションを見つけました。 Glassfishは出力ストリームをチャンクし、各チャンクは別々にコミットされます。しかし、最初のチャンクがコミットされた後、ELFlash実装は、応答全体がコミットされ、失敗すると判断します。

グラスフィッシュでチャンクを無効にした後、すべての問題はなくなりました。 http://www.dirkreske.de/jsf1095-with-glassfish-3-1/

ディルク

関連する問題