1

我在 DataTable 组件中使用 convertDateTime 标记。将托管 bean 属性连接到时区属性。在这种情况下,每个 ajax 都会请求重新创建托管 Bean。

托管 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问题 1492有关,该问题已针对即将发布的 JSF 2.2 进行了修复。简而言之,视图范围的 bean 存储在视图状态中。因此,当要恢复视图时,视图范围的 bean 尚不可用。但是标记处理程序(以及idJSFbinding组件的属性)在构建视图期间运行,因此它将隐式创建一个全新的视图范围 bean 实例。然而,在恢复视图之后,那些新的视图范围的 bean 实例将被视图状态中的那些替换。另请参阅 @ViewScoped标签处理程序中的失败

有几种方法可以解决这个特定问题,所有这些都在这个答案中列出:如何为数据表的每一行设置转换器属性?但在您的特定情况下,可能有一个更简单的解决方案:您似乎希望在所有日期时间转换器中使用系统的默认时区。您也可以通过在中设置以下上下文参数来实现此目的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 回答