Icefaces 2.0:ice问题:自定义组件中的selectInputDate

时间:2011-03-15 19:19:57

标签: jsf jsf-2 composite-component selectinputdate

我正在尝试创建一个自定义的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异常:   无法转换03/03/11 20:00的类型   类java.util.Date到类   java.sql.Date

奇怪的是,如果我使用ice:selectInputDate在我的复合组件之外,我没有得到那个错误。有什么想法吗?

1 个答案:

答案 0 :(得分: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项目的贡献?我从来没有真正贡献任何开源,所以我真的不知道它是如何工作的。