我正在使用转换器使用rich:calendar解析用户填充的日期,并将enableManualInput设置为true。
富:日历(某些数据已针对安全和数据隐私问题进行了修改):
<rich:calendar enableManualInput="true"
value="#{beanAction.periodFrom}" showFooter="true"
timeZone="#{beanAction.timeZone}"
id="periodFrom"
datePattern="#{beanAction.datePattern}"
showApplyButton="true" popup="true"
converterMessage="#{bndl.invalidDateFormat}">
<f:converter converterId="JSFStringToDateConverter"/>
</rich:calendar>
在转换器中,我使用SimpleDateFormat解析日期。但是,如果解析失败,我正在执行一些业务逻辑,然后抛出一个ConverterException。
转换器方法
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent,
String inputString) throws ConverterException {
Date date = null;
try {
date = simpleDateFormat.parse(inputString);
} catch (ParseException e) {
e.printStackTrace();
BeanAction beanAction = (BeanAction) facesContext
.getApplication().evaluateExpressionGet(facesContext,
"#{beanAction}", BeanAction.class);
if (beanAction != null) {
beanAction.setShowErrorMessagePopup(true);
}
throw new ConverterException();
}
return date;
}
在调试代码时,我得到了通过转换器的操作,如果一切正常,则转到beanAction。否则,转换器会抛出异常,并且页面上将根据需要呈现rich:消息。
现在我的问题就是无论我在抛出ConverterException的情况下在这个页面上做什么,通过a4j:commandButton调用的动作将不再通过转换器或beanAction,它什么都不做除非我刷新页面或重新调用再次加载此页面的操作。
A4J:的commandButton
<a4j:commandButton
value="#{bndl.apply}"
action="#{beanAction.executeAction}"
id="applyButton" styleClass="btn"
oncomplete="if(#{beanAction.showErrorMessagePopup}){#{rich:component('errorMessagePopup')}.show()};"
reRender="myPageForm,errorMessagePopup,errorMessagePopupForm" />
我真的在这个问题上搜索了很多,没有运气,如果有人能帮助我,我会非常感激。
作为一种解决方法,我已经从Converter中删除了抛出的异常,并从beanAction处理了null值(一旦解析失败)。虽然,这解决了我的问题,但这不是我想要处理它的方式。我仍然担心它为什么不工作,它是一个错误还是我错过了什么?