0

日付フィールドのコンバーターとメッセージタグを入力しないようにするために、カスタムjsf2コンポーネントを作成しようとしています。テンプレートを使用してIcefaces1.xでこれを行いました。しかし、JSF 2では、複合コンポーネントを使用せざるを得ませんでした。それは私が望んでいたほどうまくいっていません。

複合コンポーネントが正常に作成されました。

<composite:interface>
    <composite:attribute name="style" />
    <composite:attribute name="partialSubmit" />
    <composite:attribute name="rendered" />
    <composite:attribute name="immediate" />
    <composite:attribute name="value" required="true" />
    <composite:attribute name="pattern" required="true" />
</composite:interface>

<composite:implementation>
    <ice:panelGroup rendered="#{cc.attrs.rendered}">
        <ice:selectInputDate value="#{cc.attrs.value}"
            style="#{cc.attrs.style}" id="input" renderAsPopup="true"
            partialSubmit="#{cc.attrs.partialSubmit }"
            immediate="#{cc.attrs.immediate }">
        </ice:selectInputDate>
        <ice:message for="input" style="color: red; display: block"></ice:message>
    </ice:panelGroup>
</composite:implementation>

プロパティがnullの場合、コンポーネントは期待どおりに動作します。ただし、データベースからデータをロードすると、java.sql.Dateインスタンスが取得されます(オブジェクトがjava.util.dateを使用しているにもかかわらず、前者は後者を拡張します)、次の例外が発生します。

java.lang.IllegalArgumentException:タイプクラスjava.util.Dateの03/03/1120:00をクラスjava.sql.Dateに変換できません

奇妙なことに、複合コンポーネントの外部でice:selectInputDateを使用しても、そのエラーは発生しません。何か案は?

4

1 に答える 1

0

了解しました。これは、Tomcatの再構築という回避策としては少し極端すぎるように思われるかもしれません。tomcatはJSFやICEFacesほど頻繁には変更されないと思いました。必要に応じて、ハックと呼んでください。それは私の問題を解決します...

使用しているバージョンのTomcatソースをダウンロードし、ELSupport.javaという名前のファイルを見つけます。このシグネチャを持つメソッドを探します。

public static final Object coerceToType(final Object obj,
        final Class<?> type) throws ELException {

次に、ELExceptionをスローする行のすぐ上に、次の行を追加します。

if (java.util.Date.class.isAssignableFrom(obj.getClass())){
    return obj;
}

オブジェクトがjava.util.Dateのサブクラスのインスタンスである場合に、例外がスローされるのを防ぐだけです。

これがTomcatプロジェクトへの貢献だと思う人はいますか?私はオープンソースに実際に貢献したことは一度もないので、それがどのように機能するのか本当にわかりません。

于 2011-03-16T14:24:59.897 に答える