2012-03-12 46 views
1

我是JSF的新手,我确信我在做一些愚蠢的事情,但是我一直在尝试不同的事情几天而不能取得任何进展。我试图在用户输入日期而不是使用丰富的日历时进行验证,但由于某种原因,我似乎无法让验证器启动。该页面代码如下:Rich Calendar验证程序

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

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

谢谢!

+0

为什么如果''在从'String'到'Date'的隐式转换步骤中自己已经“验证”它,那么您需要格式验证程序? – BalusC 2012-03-12 20:50:47

+0

需求状态,我需要收集所有的验证数据,并将其放入弹出窗口(使用JQuery),我很难让日历字段中显示Faces消息。上述方法与其他领域的工作。也许我应该回去弄清楚为什么这些Faces Messages不会先显示出来,然后使用内部验证器。 – 2012-03-12 21:00:27

+0

我认为你并没有理解真正的问题。我发布了一个答案。 – BalusC 2012-03-12 21:06:46

回答

3

这没有任何意义。 <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" /> 

或者,如果你真的需要自己“验证”的日期格式,实现自定义Converter而不是由converter属性或<f:converter>标签,而不是注册。

+0

谢谢! converterMessage正是我所需要的。 – 2012-03-12 21:07:39

+2

不客气。在未来的问题中,不要忘记更清楚地陈述功能要求。你应该试着问如何解决问题,而不是如何实现你认为的解决方案,它是问题的正确解决方案:) – BalusC 2012-03-12 21:10:44