2011-03-15 91 views
0

我正在尝试创建自定义jsf2组件以避免为我的日期字段输入转换器和消息标记。我使用模板来完成Icefaces 1.x的工作。但是,在JSF 2中,我被迫使用复合组件;这并不如我所希望的那样。Icefaces 2.0:冰问题:自定义组件中的selectInputDate

的复合元件已成功创建:

<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> 

当属性为空时,该组件按预期运行然而,当我从我的数据库加载数据,我得到一个java.sql.Date实例(尽管我的对象使用java.util.date的事实 - 前者扩展后者),我得到这个异常:

java.lang.IllegalArgumentException异常: 无法转换03/03/11 20:00型 类java.util.Date中来 类java.sql.Date

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

+0

只是好奇:你为什么被迫创建复合组件?这个决定是否来自更高层次,或者出于某种原因,您不能在IceFaces 2.0中使用模板吗? – BalusC 2011-03-15 19:43:33

+0

您可以使用模板。但是,当我使用带输入组件的旧模板时遇到了问题;我不断收到重复的组件id异常。在浪费了一天的时间试图让它工作之后,我决定转向新的方法。还有一天...... :) – Andre 2011-03-15 19:52:25

+0

为了确保我不在类路径地狱附近或类似的地方,我在Tomcat 7中用IceFaces 2.0创建了一个测试项目。我使用java.util创建了一个bean .date字段并为其分配一个java.sql.date实例。问题**可以被复制。看起来像一个bug ... – Andre 2011-03-15 22:12:06

回答

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项目的贡献吗?我从来没有真正为开源贡献任何东西,所以我真的不知道它是如何工作的。