8

私が抱えている問題は、PrimesFaces 3.4.1 カレンダーにあります。ボタンまたは入力フィールドのフォーカスでアクティブ化されたポップアップ日付ピッカーを使用する場合、正常に機能する有効な日付のみを選択できます。

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

  • 2012 年 2 月 30 日は 2014 年 2 月 6 日になります
  • 322/05/2012 は 5/10/2038 になります
  • 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. 私が考えていない他の何か!

事前に感謝します。これにより、何週間も問題が発生しています。

4

2 に答える 2

14

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

DateFormat#setLenient()平易な Java 用語で言えば、これはを渡すことでオフにできますfalse。とりわけ、この質問を参照してください: dateformat を使用して日付を検証する

JSF の用語では、基本的に、非寛容な を使用するカスタム コンバーターを提供する必要がありますDateFormat。幸いなことに、標準の JSF はすでに のフレーバーでそのようなものを提供している<f:convertDateTime>ので、直接利用することができます。

<p:calendar ...>
    <f:convertDateTime pattern="dd/MM/yyyy" />
</p:calendar>
于 2012-12-07T16:12:17.107 に答える
0

faces-config.xml にこれを追加します

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

上記のクラス、つまり LocaldateConverter で、これを以下のコードに追加します

/**
 * @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();
}
于 2014-01-24T13:34:18.187 に答える