丰富的日历验证器

Don*_*ino 1 jsf richfaces ajax4jsf jsf-2

我是 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>
Run Code Online (Sandbox Code Playgroud)

我试图调用的 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")));

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<div class="div30">
    <p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
    <h:inputText id="programInvoiceId"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.programInvoiceId}"/>
</div>
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Bal*_*usC 5

这没有任何意义。该<rich:calendar>会已隐式转换String提交值Date设置它作为模型前值。如果您以无效格式输入日期,<rich:calendar>则已经ConverterException为此抛出一个。它的消息应该已经在与组件关联的任何<h:messages><h:message>组件中可见。

由于转换验证之前运行,因此在转换失败时永远不会触发您的验证器。即使您的验证器被触发,验证器中的Object value参数也已经是 类型java.util.Date。因此,如果您的验证器被触发,它总是会抛出异常,因为Date#toString()绝对不匹配MM/dd/yyyy

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

<rich:calendar ... converterMessage="Invalid date" />
Run Code Online (Sandbox Code Playgroud)

或者,如果您真的需要自己“验证”日期格式,请Converter改为实现自定义并通过converter属性或<f:converter>标签注册它。

  • 别客气。在以后的问题中,不要忘记更清楚地说明功能要求。您应该尝试询问如何解决问题,而不是如何实现您*认为*这是解决问题的正确解决方案:) (2认同)