Jsf 2 转换器是否总是在模型视图更新之前运行?

Jsf 2 转换器是否总是在模型视图更新之前运行?,jsf-2,Jsf 2,例如: <h:form> <h:selectOneMenu value="#{bean.timezone}> <f:selectItems value="#{bean.availableTimezones} ... > <f:ajax render="currenttime" /> </h:selectOneMenu> </h:form> <h:form id="cur

例如:

<h:form>
    <h:selectOneMenu value="#{bean.timezone}>
        <f:selectItems value="#{bean.availableTimezones} ... >
        <f:ajax render="currenttime" />
    </h:selectOneMenu>
</h:form>

<h:form id="currenttime">
    <h:outputText value="#{bean.currentTime}" >
        <f:convertDateTime dateStyle="short" type="both" timeZone="#{bean.timezone}" />
    </h:outputText>
</h:form>

<!-- bean.currentTime is of type 'Date' -->

在本例中,更改时区应导致
currenttime
中的文本显示在正确的时区中。但事实并非如此

我认为这是因为转换器是在“应用请求”阶段计算的,而选定时区的值是在“更新模型”阶段更新的

我说得对吗? 我应该不使用转换器吗


谢谢

您的具体问题是因为
是在视图生成时初始化的,而不是在视图渲染时()初始化的。实际上,这在更新模型值阶段之前就已经运行了,因此在视图渲染期间,转换器将不会使用用户提交的时区进行设置

这个问题的理由与以下答案基本相同:

其中一种方法是将转换器实例作为bean属性进行管理和绑定

private DateTimeConverter converter;

@PostConstruct
public void init() {
    converter = new DateTimeConverter();
    converter.setDateStyle("short");
    converter.setType("both");
}

public DateTimeConverter getDateTimeConverter() {
    converter.setTimeZone(timezone);
    return converter;
}


另一种方法是使用支持转换器属性的rendertime评估的:

<h:outputText value="#{bean.currentTime}" >
    <o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>


您的h:SelectOne菜单是否也在表单中?是的,与输出文本所在的表单不同。对于评论,我将更新问题。omnifaces我正在使用omnifaces并喜欢它,因此这里的选择很明确:-)
<h:outputText value="#{bean.currentTime}" >
    <o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>