2012-03-12 7 views
1

私は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> 

このバリデーターが1つの場所で動作し、別の場所で動作しない理由はありますか?

ありがとうございます!

+0

'が' String'から 'Date'への暗黙的な変換ステップの間にそれ自身で' 'validating ''している場合、なぜ形式のバリデータが必要ですか? – BalusC

+0

要件には、すべての検証データを収集してポップアップ(JQueryを使用)に入れる必要があると記載されており、日付フィールドにFacesメッセージを表示するのが困難でした。他の分野では、上記のアプローチが有効でした。たぶん私は戻って、これらの顔のメッセージが最初に表示されなかった理由を理解してから、内部バリデーターを使用してください。 –

+0

あなたは本当の問題を理解していないと思います。私は答えを掲示した。 – BalusC

答えて

3

これは意味をなさない<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" /> 

それとも、あなたが本当に自分で日付形式を「検証」する必要がある場合は、代わりにカスタムConverterを実装し、converter属性またはその代わり<f:converter>タグでそれを登録します。

+0

ありがとう! converterMessageは私が必要としていたものです。 –

+2

ようこそ。将来の質問では、機能要件をより明確に述べることを忘れないでください。どのように問題を解決するかを尋ねるべきではなく、それが問題の正しい解決策であると思った解決法を達成する方法ではありません。 – BalusC

関連する問題