0

我正在尝试创建一个自定义 jsf2 组件,以避免为我的日期字段输入转换器和消息标签。我已经使用模板在 Icefaces 1.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/11 20:00 转换为 java.sql.Date 类

奇怪的是,如果我在复合组件之外使用 ice:selectInputDate,我不会收到该错误。有任何想法吗?

4

1 回答 1

0

好吧,这似乎有点过于极端了:重建 Tomcat。我认为tomcat 不会像JSF 或ICEFaces 那样经常更改。如果必须的话,可以称之为 hack;它解决了我的问题...

下载您使用的版本的 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 回答