2012-03-23 5 views
0

Spring Webflowのprimefacesコンポーネントの永続性に問題があります。コンポーネントが元のページ要求の一部としてインスタンス化されていれば、すべて正常に動作します。しかし、コンポーネントがajaxリクエスト中にインスタンス化されると、それらは正しく永続化されず、後でそれらを取得するときに空のオブジェクトが取得されます。たとえば、タブビューの2番目のタブ(dynamic = true)のコンポーネントが機能しないなどです。例:ページが最初にロードされるとSpring Webflowのプライムフェイスコンポーネントの永続性

<!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:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 

    <h:head> 
     <ui:insert name="headIncludes" /> 
    </h:head> 
    <h:body> 
     <h:form id="testForm"> 
      <p:tabView id="myTabView" dynamic="true"> 
       <p:tab title="Tab One" id="tabOne"> 
        <h:panelGroup id="tabOneGroup"> 
         <p:commandLink id="linkX" value="Link X" actionListener="#{sandboxBean.testCommandLinkx}" > 
          <f:ajax /> 
         </p:commandLink> 
        </h:panelGroup> 
       </p:tab> 
       <p:tab title="Tab Two" id="tabTwo"> 
        <h:panelGroup id="tabTwoGroup"> 
         <p:commandLink id="linkY" value="Link Y" actionListener="#{sandboxBean.testCommandLinky}" > 
          <f:ajax /><!-- Only matters if we switch to h:commandLink --> 
         </p:commandLink> 
        </h:panelGroup> 
       </p:tab> 
      </p:tabView> 
     </h:form> 
    </h:body> 
</html> 

、LINKXがインスタンス化されたcommandLinkと「のactionListener」の属性値を表すのUIComponentが保存されます。 "Link X"をクリックすると、この属性値が再び取り出され、testCommandLinkx()の呼び出しに使用されます。これは正常に動作します。

タブ2に切り替えると、ajax要求が行われ、この間にlinkYを表すUIComponentも同じ方法で作成され、永続化されます。しかし、実際にcommandlinkをクリックしてactionListener属性値を取得しようとすると、そのような属性は存在しません。代わりに全く新しいオブジェクトを受け取ります。

tabViewのdynamic = "false"に変更すると、両方のコマンドリンクが作成され、初期ページ要求時に永続化され、すべて正常に動作します。 dynamic = "true"にして、p:commandLinkではなくh:commandLinkを使用すると、すべて正常に動作します。

今、私は本当にこれがプライムフェイスのバグではないと思っています。他の人もこの特定のコード断片を問題なくテストしました。同じ理由で、私はこれがWebflowのバグだとは思わない。私たちのプロジェクトでは構成エラーである可能性が高いようですが、どこにはわかりません。すべての単一の設定ファイルを含めるのに少し時間がかかるようですが、コメントの内容を見たい場合はコメントを追加します。異なるコンポーネントのバージョンについては

人々は間違いなく要求されますよう:

  • Primefaces:ダイナミックtabViewsための3.0.1以降のすべてのバージョン(これは本当のためにそれをサポートする最初のバージョンだった)が、それは可能ですがajaxリクエストでコンポーネントをインスタンス化する別のコンストラクトを使用すると、以前のバージョンで再作成できます。
  • クロサギ科:2.0.4(私も改善せず2.0.8及び2.1.6を試みた)
  • 春のWebflow:2.2.1(また、2.3を試してみました)
  • のTomcat:7.0.12(しようとしています
+0

代わりに ''に ''を入れてみてください。さらにそれらの ''タグは不要です。すべてのPrimeFacesコマンドリンク/ボタンはデフォルトですでにアジャクション化されていますが、ブール値を受け入れる 'ajax'属性で設定されているはずです。 – BalusC

+0

フォームを切り替えても何も変わりません。 はp:commandLinkでは必要ありませんが、h:commandLinkに切り替えると機能が同じであることが保証されます。私は人々に理由を考えさせたくありませんh:commandLinkの仕事はそれがajax要求ではないということです。 – MatsT

+0

あなたは* "実際にコマンドリンクをクリックしてactionListener属性値を取得しようとすると、そのような属性がないことがわかります。代わりに全く新しいオブジェクトを受け取ります。アクションリスナーメソッド内のビュールート(またはアクションイベント引数)からコンポーネントを取得し、getValue()によってコマンドコンポーネントの値を取得しようとしていますか?もしそうなら、なぜですか? – BalusC

答えて

0

この問題は、Spring WebFlowのバグであり、実際には3月27日にリリースされた2.3.1で修正されています。