JSF中convertDateTime的奇怪行为

时间:2012-05-25 07:52:43

标签: java richfaces jsf-1.2

我正在使用带有richfaces的JSF。我使用core ip的convertDateTime将inputText转换为Date。

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield">
  <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>

SearchBean 中的 creationDate 属于Java util Date类型,我使用jquery datpicker来填充输入字段。

问题是它工作不正常。当我在没有输入任何日期(空输入字段)的情况下提交表单时,一切正常。但是,当我选择日期时,调用不会到达bean(在调试模式下测试它)。该页面只是刷新自己,没有任何异常/在服务器端登录。

我实施了一个快速LifeCycleListener,其中显示了以下输出:

输入字段填充日期:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE UPDATE_MODEL_VALUES(4)
END PHASE UPDATE_MODEL_VALUES(4)
START PHASE INVOKE_APPLICATION(5)
END PHASE INVOKE_APPLICATION(5)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

空白日期:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

很明显,在第二种情况下缺少两个步骤。我是JSF的新手,对它的内部工作并不太了解。此外,没有验证/转换例外。我被困在这里,我不知道在哪里寻找解决方案。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

当您没有输入日期时,更新模型和调用应用程序未显示的原因是因为验证失败,如果验证失败模型未更新UI内容,则不会调用应用程序逻辑(您的自定义代码)。 / p>

如果您在.properties文件中添加了错误消息,请添加以下内容

javax.faces.converter.DateTimeConverter.DATE=value ({0}) must be a date

其他

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield" converterMessage="Please Enter creation date in yyyy-MM-dd format">
  <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>

这样可以在验证失败时显示错误消息。

将null作为日期提交时,您将收到转换错误。

答案 1 :(得分:1)

如果您正在使用JSF 1.2和RichFaces 3.x,那么使用rich:calendar标记组件来处理日期,它会在幕后使用jquery来显示。在您的示例中使用它:

<rich:calendar id="calCreationDate" popup="true"
    value="#{searchBean.creationDate}"
    enableManualInput="true"
    locale="#{application.locale}"
    datePattern="#{application.datePattern}"
    showApplyButton="false" />

在我的申请中:

public class ApplicationBean {
    private Locale locale;
    private String datePattern;

    public ApplicationBean() {
        locale = new Locale("es"); //for spanish
        datePattern = "dd/MM/yyyy"; //you can change it to yyyy-MM-dd
    }
}

ApplicationBean具有ApplicationScope。

更多信息: