2011-03-15 65 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項目的貢獻嗎?我從來沒有真正爲開源貢獻任何東西,所以我真的不知道它是如何工作的。