2012-03-13 3 views
0

私のアプリケーションはrich:カレンダーとh:inputTextを使います。 intputText(非数値データ)のUIに不正なデータを入力して「検索」を押すと、Beanから適切なエラーメッセージが表示されます。しかし、inputText(数字以外)とrich:calendar( "foo"などの日付以外の入力)の両方に無効なデータを入れると、私はrich:カレンダーのエラーメッセージのみを返します。あたかもネイティブの豊富なカレンダ検証メッセージが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; 
} 

任意の提案を大幅に理解されるであろう。 ありがとう!

答えて

0

アクションメソッド内で検証を実行しないでください。 <f:validator>または標準<f:validateXxx>タグのいずれかでバインドする通常のValidatorを使用して実行する必要があります。検証が失敗した場合、アクションメソッドは呼び出されません。

たとえば、プログラム請求書IDを確認するには、<f:validateRegex>を使用します。

<h:inputText id="programInvoiceId" value="#{appealSearchManager.programInvoiceId}" validatorMessage="Invalid Program Invoice ID. Must be comma delimited list of numbers."> 
    <f:validateRegex pattern="^([0-9]+(-[0-9]+)*,*)+$" /> 
</h:inputText> 

日付範囲の検証は少し複雑です。そのためには、クラスを<f:validator>としてコンポーネントの1つに配置し、他のコンポーネントの値を属性として渡す必要があります。たとえば、Compare two fields that use same classも参照してください。

ところで、用語に注意すると、ではなく、"bean validation"を使用していますが、アクションメソッドで手動で検証するだけです。

+0

私はを使いたいですが、すべてのエラーを収集して1つのjQueryポップアップで表示する必要があると述べています:-( –

+0

BTW - 用語解明に感謝します。ありがとう! –

+0

涼しい日付のバリデーション!魅力のように動作します。ありがとうございます。 –