我的应用程序使用rich:calendars和h:inputText。如果我在intputText(即非数字数据)的UI中输入不良数据,并按下“Search”,我会从bean中获取正确的错误消息。但是,如果我在inputText(非数字)和rich:日历(非日期相关的输入,例如“foo”)中输入了无效数据,我只会返回rich:calendar错误消息。就好像本地丰富的日历验证消息敲出了bean验证消息。rich:日历本机验证隐藏/覆盖/ ??我的bean验证错误
如何获取所有要显示的消息?
的XHTML代码如下:
<html xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns="http://www.w3.org/1999/xhtml"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:tr="http://myfaces.apache.org/trinidad"
xmlns:rich="http://richfaces.org/rich">
<f:view>
<br/>
<div class="container">
<tr:form id="searchCriteria" defaultCommand="appealSearchManager.search">
<a4j:outputPanel id="errorMessagesPanel">
<h:messages id="errorMessages"/>
</a4j:outputPanel>
<div class="div30">
<p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
<h:inputText id="programInvoiceId" value="#{appealSearchManager.programInvoiceId}"/>
</div>
<div class="div30">
<p><h:outputText value="#{messages.ResponseReleaseDate}"/></p>
<rich:calendar id="responseReleaseDateBegin"
enableManualInput="true" datePattern="MM/dd/yyyy"
buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
converterMessage="Invalid Response Release begin date. Format must be blah, blah, blah."
value="#{appealSearchManager.responseReleaseDateBegin}">
</rich:calendar>
<rich:calendar id="responseReleaseDateEnd"
enableManualInput="true" datePattern="MM/dd/yyyy"
buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
converterMessage="Invalid Response Release End date. Format must be blah, blah, blah."
value="#{appealSearchManager.responseReleaseDateEnd}">
</rich:calendar>
</div>
<div class="searchaction">
<div>
<ul>
<li>
<a4j:commandLink id="searchButton"
value="#{messages.Search}"
actionListener="#{appealSearchManager.search}"
reRender="errorMessagesPanel, richErrorMessages, errorMessages"
styleClass="searchbtn"/>
</li>
</ul>
</div>
</div>
</tr:form>
</div>
</f:view>
</html>
和bean代码:
public void search(ActionEvent e) {
setHasErrors(validateCriteria());
}
private boolean validateCriteria() {
boolean isValid = true;
//always check for Program Invoice ID may contain a comma-separated list of ids
if (getProgramInvoiceId() != null && !getProgramInvoiceId().equals("") && !areValidProgamInvoiceIds(getProgramInvoiceId())) {
String errorMessage = "Invalid Program Invoice ID. Must be comma delimited list of numbers.";
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
isValid = false;
}
//check Dates Response Release Date
if (!isValidDateRange("Response Release Date", getResponseReleaseDateBegin(), getResponseReleaseDateEnd())) {
isValid = false;
}
return isValid;
}
private boolean areValidProgamInvoiceIds(String ids) {
boolean validIds = true;
String regexp = "^([0-9]+(-[0-9]+)*,*)+$";
Pattern pattern = Pattern.compile(regexp);
if (!pattern.matcher(ids).matches()) {
validIds = false;
}
return validIds;
}
private boolean isValidDateRange(String dateRange, Date startDate, Date endDate) {
boolean isValidDateAndRange = true;
Calendar futureDate = Calendar.getInstance();
futureDate.roll(Calendar.DAY_OF_MONTH, 2);
if ((startDate != null && (endDate == null || endDate.equals(""))) ||
((startDate == null || startDate.equals("")) && endDate != null)) {
//one date is null and the other has a value. We need both values to do a search.
String errorMessage = "Invalid " + dateRange + " range. Missing Date. A date range must contain both start and end dates.";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
} else if (startDate != null && endDate != null) {
if (isValidDateAndRange) {
//future start dates are not allowed
if (startDate.after(futureDate.getTime())) {
String errorMessage = "Invalid date range. Start date must be less than today's date.";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
isValidDateAndRange = false;
}
//start date greater than the end date is not allowed
if (endDate.before(startDate)) {
String errorMessage = "Invalid date range. End date must be greater than or equal to start date.";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
isValidDateAndRange = false;
}
}
}
return isValidDateAndRange;
}
任何建议,将不胜感激。 谢谢!
我喜欢使用的但要求状态,我要收集所有的错误,并显示他们一个jQuery的弹出式:-( –
2012-03-14 14:50:26
顺便说一句 - 感谢澄清术语....是一个新手我仍然在理解正确的单词,我会尝试验证日期范围,如上所述。谢谢! – 2012-03-14 14:53:10
酷日期验证!像魅力一样工作。谢谢你!! – 2012-03-14 14:55:39