1

DataTable コンポーネントで convertDateTime タグを使用しています。マネージド Bean プロパティが timezone 属性に接続されました。この状況では、すべての ajax が Managed Bean の再作成を要求します。

Managed Bean のスコープは View Scoped です。

<h:column>
    <f:facet name="header">
       <h:outputLabel value="Date"/>
    </f:facet>
    <h:outputText value="#{item.date}">
         <f:convertDateTime timeZone="#{myBean.timezone}" locale="tr" pattern="dd.MM.yyyy"/>
    </h:outputText>
</h:column>




@ManagedBean(name="myBean")
@ViewScoped
public class MyBean {

   @PostConstruct
   public void initBeanMethod(){
      System.out.println("PostConstruct method is called...");
   }

   private TimeZone timezone = TimeZone.getDefault();

   public TimeZone getTimezone() {
      return timezone;
   }

   public void setTimezone(TimeZone timezone) {
      this.timezone = timezone;
   }

各 ajax リクエストの後に次の出力を表示します: "PostConstruct メソッドが呼び出されます..."

各リクエストでの Bean の再作成についてのアイデアはありますか?

注:下手な英語で申し訳ありません:)

4

1 に答える 1

2

これは、タグ ハンドラーの属性をビュー スコープの Bean にバインドすると実際に発生します。これは、今後の JSF 2.2 で修正される JSF問題 1492に関連しています。簡単に言えば、ビュー スコープ Bean はビュー ステートに格納されます。そのため、ビューが復元されるとき、ビュー スコープ Bean はまだ利用できません。ただし、タグ ハンドラー (およびidJSFbindingコンポーネントの属性) はビューの構築中に実行されるため、新しいビュー スコープの Bean インスタンスが暗黙的に作成されます。ただし、ビューを復元した後、これらの新しいビュー スコープの Bean インスタンスは、ビュー ステートのものに置き換えられます。@ViewScopedタグ ハンドラの失敗も参照 してください。

この特定の問題を解決するにはいくつかの方法がありますが、すべてこの回答で概説されています: How to set converter properties for each row of a datatable? しかし、特定のケースでは、おそらくはるかに簡単な解決策があります。すべての日時コンバーターでシステムのデフォルトのタイムゾーンを使用したいようです。で次のコンテキスト パラメータを設定するだけで、これを実現することもできますweb.xml

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>
于 2012-05-05T01:06:48.503 に答える