2012-05-04 4 views
1

DataTableコンポーネントでconvertDateTimeタグを使用しています。タイムゾーン属性にマネージドBeanプロパティを接続しました。この状況では、すべてのAjaxがManaged Beanの再作成を要求します。DataTableコンポーネントでconvertDateTimeタグを使用し、すべてのAjaxリクエストがマネージドBeanを再作成する

マネージドBeanスコープは、ビュースコープです。

<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メソッドが呼び出された...」

あなたが要求ごとに豆の再作成についての考えを持っていますか?

注:私は私の悪い英語のために謝罪:)

答えて

2

あなたがBeanをスコープビューにタグハンドラの属性をバインドする際に実際に発生します。これは、JSF issue 1492に関連しています。これは、今後のJSF 2.2で修正されています。要約すると、ビューのスコープ付きBeanはビューステートに格納されます。したがって、ビューを復元するときは、ビュースコープBeanはまだ使用できません。しかし、タグ・ハンドラ(およびidおよびbindingのJSFコンポーネントの属性)はビューの作成中に実行されるため、新しいビュー・スコープのBeanインスタンスを暗黙的に作成します。ビューを復元した後、これらの新しいビュースコープのBeanインスタンスは、ビューステートのものに置き換えられます。 @ViewScoped fails in tag handlersも参照してください。 How to set converter properties for each row of a datatable?をしかしあなたの特定のケースでおそらくはるかに簡単解決策があります:

はすべてこの回答に概説されて、この特定の問題を解決するには、いくつかの方法がありますが、すべてのdatetime型のコンバータで、システムのデフォルトのタイムゾーンを使用するように見えます。また、次のコンテキストパラメータをweb.xmlに設定することでこれを達成することもできます。

<context-param> 
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> 
    <param-value>true</param-value> 
</context-param> 
+0

Hi BalusCあなたの啓発のお返事ありがとうございます。私は既にcontextパラメータを使用していますが、これでは正確な結果が得られません。あなたの共有リンクは慎重に読む予定です。ありがとうございました... – hakdogan

関連する問題