在DataTable组件中使用convertDateTime标记,并且每个ajax请求都重新创建Managed Bean

时间:2012-05-04 21:41:39

标签: jsf-2 managed-bean date-conversion ajax-request

我在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?

注意:我为我糟糕的英语道歉:)

1 个答案:

答案 0 :(得分:2)

将标记处理程序的属性绑定到视图范围的bean时,确实会发生这种情况。这与JSF issue 1492有关,它为即将推出的JSF 2.2修复。简而言之,视图范围内的bean存储在视图状态中。因此,当要还原视图时,视图范围的bean尚不可用。但是标记处理程序(以及JSF组件的idbinding属性)在构建视图期间运行,因此它将隐式创建一个全新的视图范围bean实例。恢复视图后,这些新的视图范围bean实例将被视图状态中的实例替换。另见@ViewScoped fails in tag handlers

有几种方法可以解决这个特定的问题,所有这些都在这个答案中概述: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>