我是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>
为什么这个验证器在一个地方而不是另一个地方工作的任何想法?
谢谢!
答案 0 :(得分:4)
这没有任何意义。在将<rich:calendar>
提交的值设置为模型值之前,String
已隐式将Date
提交的值转换为<rich:calendar>
。如果您输入无效格式的日期,则ConverterException
已经为此<h:messages>
投了<h:message>
。其消息应该已在与该组件关联的任何Object value
或java.util.Date
组件中可见。
由于转换在验证之前运行,因此转换失败时永远不会触发验证程序。即使您的验证程序被触发,验证程序中的MM/dd/yyyy
参数也是已经类型converterMessage
。因此,如果你的验证器被触发,那么始终会抛出异常,因为Date#toString()
肯定不匹配<rich:calendar ... converterMessage="Invalid date" />
。
我不确定你为什么需要这个验证器。也许您只是想提供自定义转换错误消息?在这种情况下,您应该使用其Converter
属性。
converter
或者,如果你真的需要&#34;验证&#34;您自己定义日期格式,实现自定义<f:converter>
,然后通过{{1}}属性或{{1}}标记进行注册。