2012-12-07 17 views
8

私が抱えている問題はPrimesFaces 3.4.1カレンダーにあります。ボタンまたは入力フィールドのフォーカスのいずれかで有効にされたポップアップの日付ピッカーを使用する場合は、うまく動作する有効な日付のみを選択することができます!PrimeFacesカレンダーで無効な日付を入力として受け入れる

入力フィールドに手動で日付を追加するときに問題が発生します。無効な日付を追加した場合、PrimeFacesカレンダーコンポーネントは有効な日付に変換して送信することで最善の推測を行います。つまり、バックエンド検証いいえ。以下のいくつかの興味深い翻訳:

  • 30/02/2012は、2014年2月6日
  • 322/05/2012となり2038年5月10日
  • 2012年1月14日は2012年4月1日になるとなり、

この狂気を再現するには、PrimeFaces Calendar Showcaseをご覧ください。

私はreadOnlyInput='true'属性を使用して解決策を見ましたが、数字またはスラッシュではないフィールドに文字が入力されないように見えます。以下は、私が実装したカレンダーの1つのインスタンスは、次のとおりです。

<p:calendar id="fldDateOfBirth" 
      value="#{pc_CreateUser.user.dateOfBirth}" 
      binding="#{pc_CreateUser.dobComp}" 
      navigator="true" 
      pattern="dd/MM/yyyy" 
      maxlength="10" 
      yearRange="-100" 
      validator="#{pc_CreateUser.validateDOB}" 
      title="#{msg.user_date_format_default_tip}" 
      converterMessage="#{msg.user_error_dob_invalid}" 
      readOnlyInput="true" 
      showOn="button" /> 

ソリューション賢明な私は、任意の提案を開いています:

  1. これはPrimeFacesで共通の問題ですか?私は にそれを修正するために使用できるトリックがありますか?
  2. 送信前にJavaScriptを使用して日付を確認することも、 はすべてのユーザー入力を完全にブロックすることができますか?
  3. 私が考えていないものは他にありますか?

これは私に数週間問題を引き起こしています。

答えて

13

<p:calendar>は、デフォルトでlenientの解析を使用するカバーを使用し、オーバーフローした値を次の日付のメトリックレベルにロールオーバさせます。例えば。 1月32日は2月1日などになります。

普通のJavaの言い方をすれば、DateFormat#setLenient()falseをオフにすることができます。他にもこの質問:validating a date using dateformatも参照してください。

JSFでは、基本的に、非寛大であるDateFormatを使用するカスタムコンバータを用意する必要があります。幸いにも、標準のJSFは既にフレーバーのボックスに<f:convertDateTime>を提供しているので、直接使用することができます。顔-config.xmlに

<p:calendar ...> 
    <f:convertDateTime pattern="dd/MM/yyyy" /> 
</p:calendar> 
+0

の下に以下を追加!ソリューションとあなたの説明をありがとう、非常に感謝します。 – JonnyIrving

+0

ようこそ。 – BalusC

+0

このconvertDateTimeを使用して古いバージョンのprimefaceを使用すると変換がnullになり、JavaScriptエラーが発生します。 (getDate == null) PF4にアップグレードすることができれば残念ですが、私は選択肢を検討することができません:) – VeenarM

0

すなわちLocaldateConverter上記のクラスでこの

<converter> 
    <converter-id>localDateConverter</converter-id> 
    <converter-class>com.utility.LocalDateConverter</converter-class> 
</converter> 

を追加。これは御馳走を働いたコード

/** 
* @param facesContext . 
* @param uiComponent . 
* @param input . 
* @return Object . 
*/ 
@Override 
public Object getAsObject(final FacesContext facesContext, final UIComponent uiComponent, final String input) { 
    if (StringUtils.isBlank(input)) { 
     return null; 
    } 
    final String componentPattern = (String) uiComponent.getAttributes().get("datePattern"); 
    final String patternToUse = componentPattern != null ? componentPattern : CommonConstants.OUTPUT_DATE_FORMAT; 
    try { 
     final DateFormat fmt = new SimpleDateFormat(patternToUse); 
     Date convertedDate = new java.sql.Date(fmt.parse(input).getTime()); 
     return convertedDate; 
    } catch (Exception e) { 
     throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Date Format", null)); 
    } 
} 

/** 
* @param facesContext . 
* @param uiComponent . 
* @param obj . 
* @return String . 
*/ 
@Override 
public String getAsString(final FacesContext facesContext, final UIComponent uiComponent, final Object obj) { 
    if (obj==null) { 
     return null; 
    } 
    final Date date = (Date) obj; 
    return date.toString(); 
} 
+0

これはどのように役立ちますか?あなたはあなたがしていることを彼らにも知らせません。あなたがしているのは、現在の標準のjsf datetimeコンバータをコピーすることだけです。 – VeenarM

関連する問題