【问题标题】:Rich Calendar Validator丰富的日历验证器
【发布时间】:2012-03-29 07:08:59
【问题描述】:

我是 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>

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

谢谢!

【问题讨论】:

  • 如果&lt;rich:calendar&gt; 在从StringDate 的隐式转换步骤中已经自行“验证”它,为什么还需要格式验证器?
  • 需求说明我需要收集所有验证数据并将其放入弹出窗口(使用 JQuery),但我很难让 Faces 消息出现在日期字段中。对于其他领域,上述方法有效。也许我应该回去弄清楚为什么这些 Faces Messages 不会首先出现,然后使用内部验证器。
  • 我认为你没有理解真正的问题。我发布了一个答案。

标签: jsf jsf-2 richfaces ajax4jsf


【解决方案1】:

这毫无意义。 &lt;rich:calendar&gt; 将在将 String 提交的值设置为模型值之前将其隐式转换为 Date。如果您输入的日期格式无效,&lt;rich:calendar&gt; 将为此抛出 ConverterException。它的消息应该已经在与该组件关联的任何&lt;h:messages&gt;&lt;h:message&gt; 组件中可见。

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

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

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

或者,如果您确实需要自己“验证”日期格式,请改为实现自定义 Converter 并通过 converter 属性或 &lt;f:converter&gt; 标记进行注册。

【讨论】:

  • 谢谢! converterMessage 正是我所需要的。
  • 不客气。在以后的问题中,不要忘记更清楚地说明功能需求。您应该尝试询问如何解决问题,而不是如何获得您认为它是解决问题的正确解决方案的解决方案:)
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多