Jsf 丰富日历验证程序

Jsf 丰富日历验证程序,jsf,jsf-2,richfaces,ajax4jsf,Jsf,Jsf 2,Richfaces,Ajax4jsf,我是JSF新手,我肯定我做了一些愚蠢的事情,但我已经尝试了几天不同的事情,没有任何进展。我试图在用户键入日期而不是使用丰富日历时进行验证,但由于某些原因,我似乎无法启动验证程序。页面代码如下: <a4j:outputPanel id="responseReleaseDate" rendered="#{appealSearchManager.isVendor}"> <p><h:outputText value="#{messages.ResponseRelea

我是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>
    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。。。方法使用下面的代码,我知道,它对于文本字段没有意义,只是用于测试目的。但是,当我为rich calendar输入输入时,我从未点击过该方法

<div class="div30">
    <p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
    <h:inputText id="programInvoiceId"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.programInvoiceId}"/>
</div>
你知道为什么这个验证器在一个地方工作而不是在另一个地方吗

谢谢

这毫无意义。在将字符串提交值设置为模型值之前,已将其隐式转换为日期。如果您以无效格式输入日期,则将已经为此引发ConverterException。其消息应该已经在与该组件关联的任何组件中可见

由于转换在验证之前运行,所以当转换失败时,您的验证器永远不会被触发。即使在启动验证器时,验证器中的Object-value参数也已经是java.util.Date类型。因此,如果您的验证器被触发,它将始终抛出异常,因为它肯定与MM/dd/yyyy不匹配

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

<rich:calendar ... converterMessage="Invalid date" />
或者,如果您真的需要自己验证日期格式,请实现一个自定义转换器,并通过转换器属性或标记注册它。

这没有意义。在将字符串提交值设置为模型值之前,已将其隐式转换为日期。如果您以无效格式输入日期,则将已经为此引发ConverterException。其消息应该已经在与该组件关联的任何组件中可见

由于转换在验证之前运行,所以当转换失败时,您的验证器永远不会被触发。即使在启动验证器时,验证器中的Object-value参数也已经是java.util.Date类型。因此,如果您的验证器被触发,它将始终抛出异常,因为它肯定与MM/dd/yyyy不匹配

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

<rich:calendar ... converterMessage="Invalid date" />

或者,如果您确实需要自己验证日期格式,改为实现自定义转换器,并通过转换器属性或标记进行注册。

如果在从字符串到日期的隐式转换步骤中,已在验证格式,为什么需要该格式的验证器?需求说明我需要收集所有验证数据,并使用JQuery和我很难让Faces消息出现在日期字段中。在其他领域,上述方法行之有效。也许我应该回去弄清楚为什么这些Faces消息不会首先出现,然后使用内部验证器。我想你还不明白真正的问题所在。我发布了一个答案。如果在从字符串到日期的隐式转换步骤中,已经在验证格式了,那么为什么您需要一个验证程序来验证格式?需求声明我需要收集所有验证数据,并使用JQuery将其放入一个弹出窗口中,我很难让Faces消息显示日期领域。在其他领域,上述方法行之有效。也许我应该回去弄清楚为什么这些Faces消息不会首先出现,然后使用内部验证器。我想你还不明白真正的问题所在。我贴了答案,谢谢!Converter消息正是我需要的不客气。在以后的问题中,不要忘记更清楚地说明功能需求。你应该试着问如何解决问题,而不是如何找到一个你认为是解决问题的正确方法的解决方案:谢谢!Converter消息正是我需要的不客气。在以后的问题中,不要忘记更清楚地说明功能需求。你应该试着问如何解决问题,而不是如何找到一个你认为是解决问题的正确方法的解决方案: