带转换器的Primefaces日历不';t在ajax上正确更新“;“价值变化”;事件

带转换器的Primefaces日历不';t在ajax上正确更新“;“价值变化”;事件,ajax,jsf,primefaces,calendar,converter,Ajax,Jsf,Primefaces,Calendar,Converter,我希望我的p:calendar既可以通过单击日历弹出窗口中的日期来工作,也可以通过直接在文本输入字段中编辑日期来工作 这很好: <p:calendar value="#{myBackingBean.date}"> <p:ajax event="valueChange" listener="#{myBackingBean.updateDate()}" /> <p:ajax event="dateSelec

我希望我的
p:calendar
既可以通过单击日历弹出窗口中的日期来工作,也可以通过直接在文本输入字段中编辑日期来工作

这很好:

        <p:calendar value="#{myBackingBean.date}">
            <p:ajax event="valueChange" listener="#{myBackingBean.updateDate()}" />
            <p:ajax event="dateSelect" listener="#{myBackingBean.selectDate()}" />
        </p:calendar>

但是,只要我添加了一个转换器(见下文),新日期就不再为“valueChange”事件设置(当通过键盘在文本字段中编辑日期时),即使新日期已正确转换,但在支持bean中设置的日期是旧值,而不是我在文本字段中编辑的新值:

        <p:calendar value="#{myBackingBean.date}">
            <f:converter converterId="myLocalDateConverter"/>
            <p:ajax event="valueChange" listener="#{myBackingBean.updateDate()}" />
            <p:ajax event="dateSelect" listener="#{myBackingBean.selectDate()}" />
        </p:calendar>

我怎样才能让它一起工作?

请参考此


它使用日历的converter属性来实现自定义转换器。此示例专门针对Java8DateAPI。您可以相应地编写代码。

我找到了问题的原因:转换器从输入字段接收到无法正确转换的文本。显然,这会导致标准JSF生命周期的中断,并设置旧值而不是新值。使用格式正确的输入,整个过程将按预期进行。

在primefaces中,日历具有converter属性。使用此属性传递转换器id。听起来是个好主意,但遗憾的是,如果使用
converter
属性或
元素,效果是一样的。