3

JSF2.0とRichFaces4を使用しています。日付の入力には、パターンを強制しようとしていますmm/dd/yyyy

<h:inputText value="#{bean.startDate}">
    <f:convertDateTime pattern="mm/dd/yyyy"/>
</h:inputText>

ユーザーが実際にそのように2桁の年で日付を入力するとmm/dd/yy、コンバーターは自動的に年を4桁に変換します。これは望ましくありません。カスタムコンバーターを作成せずにそれを停止するにはどうすればよいですか?これはJSFコンバーターのバグですか?

4

1 に答える 1

8

これはバグではありません。それがまさにそのSimpleDateFormat仕組みです。リンクされたjavadocからの関連性の引用は次のとおりです。

  • :フォーマッターCalendarがグレゴリオ暦の場合、次の規則が適用されます。
    • ..。
    • 構文解析では、パターン文字の数が2を超える場合、桁数に関係なく、年は文字通りに解釈されます。したがって、パターン「MM / dd / yyyy」を使用すると、「01/11/12」は西暦12年1月11日に解析されます。
    • ..。

JSF<f:convertDateTime>はそれを隠蔽して使用しています。最善の策はDateTimeConverter、実際に渡す前に、送信された値の長さを拡張して検証することDateTimeConverterです。カスタムコンバーターの作成を回避することはできませんが、結局のところ、それはかなり単純です。

@FacesConverter("myDateTimeConverter")
public class MyDateTimeConverter extends DateTimeConverter {

    public MyDateTimeConverter() {
        setPattern("MM/dd/yyyy");
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value != null && value.length() != getPattern().length()) {
            throw new ConverterException("Invalid format");
        }
        return super.getAsObject(context, component, value);
    }

}

次のように使用します。

<h:inputText ... converterMessage="Please enter date in MM/dd/yyyy format">
    <f:converter converterId="myDateTimeConverter" />
</h:inputText>

mmパターンの(分)をMM(月)に固定したことに注意してください。

于 2012-06-19T18:44:10.027 に答える