丰富的日历验证器

时间:2012-03-12 20:48:43

标签: jsf jsf-2 richfaces ajax4jsf

我是JSF的新手,我确定我做了一些愚蠢的事,但我已经尝试了几天不同的事情并且无法取得任何进展。当用户键入日期而不是使用丰富的日历时,我尝试进行验证但由于某种原因,我似乎无法启动验证器。页面代码如下:

<a4j:outputPanel id="responseReleaseDate" rendered="#{appealSearchManager.isVendor}">
    <p><h:outputText value="#{messages.ResponseReleaseDate}"/></p>
    <rich:calendar id="responseReleaseDateBegin" datePattern="MM/dd/yyyy"
        enableManualInput="true"
        buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.responseReleaseDateBegin}">
    </rich:calendar>
    <rich:calendar id="responseReleaseDateEnd" datePattern="MM/dd/yyyy"
        enableManualInput="true"
        buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
    value="#{appealSearchManager.responseReleaseDateEnd}">
    </rich:calendar>
</a4j:outputPanel>

我尝试调用的bean代码如下:

    public void validateResponseReleaseDateBegin(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
    if (value != null && !value.equals("")) {
        try {
            simpleDateFormat.parse(value.toString());
        } catch (ParseException e) {
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR,
                MessageFormat.format((RootUtils.getCommonBundle().getString(BundleConstants.INVALID_ITEM)), "Response Release Date"),
                MessageFormat.format(RootUtils.getCommonBundle().getString(BundleConstants.INVALID_DATE_FORMAT), "Date", "MM/DD/YYYY")));

        }
    }
}

奇怪的是我可以使用下面的代码到达validateResponseReleaseDateBegin(...)方法(我知道,它对于文本字段没有意义,它仅用于测试目的)。但是当我输入富日历的输入时,我从未尝试过该方法。

<div class="div30">
    <p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
    <h:inputText id="programInvoiceId"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.programInvoiceId}"/>
</div>

为什么这个验证器在一个地方而不是另一个地方工作的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:4)

这没有任何意义。在将<rich:calendar>提交的值设置为模型值之前,String已隐式将Date提交的值转换为<rich:calendar>。如果您输入无效格式的日期,则ConverterException已经为此<h:messages>投了<h:message>。其消息应该已在与该组件关联的任何Object valuejava.util.Date组件中可见。

由于转换在验证之前运行,因此转换失败时永远不会触发验证程序。即使您的验证程序被触发,验证程序中的MM/dd/yyyy参数也是已经类型converterMessage。因此,如果你的验证器被触发,那么始终会抛出异常,因为Date#toString()肯定不匹配<rich:calendar ... converterMessage="Invalid date" />

我不确定你为什么需要这个验证器。也许您只是想提供自定义转换错误消息?在这种情况下,您应该使用其Converter属性。

converter

或者,如果你真的需要&#34;验证&#34;您自己定义日期格式,实现自定义<f:converter>,然后通过{{1}}属性或{{1}}标记进行注册。