我在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?
注意:我为我糟糕的英语道歉:)
答案 0 :(得分:2)
将标记处理程序的属性绑定到视图范围的bean时,确实会发生这种情况。这与JSF issue 1492有关,它为即将推出的JSF 2.2修复。简而言之,视图范围内的bean存储在视图状态中。因此,当要还原视图时,视图范围的bean尚不可用。但是标记处理程序(以及JSF组件的id
和binding
属性)在构建视图期间运行,因此它将隐式创建一个全新的视图范围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>