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)
任何想法为什么这个验证器在一个地方工作而不是另一个地方?
谢谢!
这没有任何意义。该<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>
标签注册它。
归档时间: |
|
查看次数: |
6484 次 |
最近记录: |