2012-10-22 72 views
2

我正在實現一個JSF組件,並需要有條件地添加一些屬性。這個問題類似於之前的JSF: p:dataTable with f:attribute results in "argument type mismatch" error,但是有完全不同的錯誤信息,所以我提出了一個新問題。JSF複合:屬性與f:屬性轉換錯誤

<composite:interface> 
    <composite:attribute name="filter" required="false" default="false" 
         type="java.lang.Boolean"/> 
    <composite:attribute name="rows" required="false" default="15" 
         type="java.lang.Integer"/> 
    ... 
</composite:interface> 

<composite:implementation> 
    <p:dataTable ivar="p" value="#{cc.attrs.dm}"> 
    <c:if test="#{cc.attrs.filter}"> 
     <f:attribute name="paginator" value="#{true}"/> 
     <f:attribute name="rows" value="#{cc.attrs.rows}"/> 
    </c:if> 
    ... 
    <p:dataTable> 
</composite:implementation> 

這會導致錯誤java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer。即使我手動設置此,我得到的錯誤:

<f:attribute name="rows" value="15"/> ... argument type mismatch 
<f:attribute name="rows" value="#{15}"/> ... java.lang.Long cannot be cast 
              to java.lang.Integer 

如果我直接添加屬性,沒有例外,正確的行數diplayed:

<p:dataTable var="p" value="#{cc.attrs.dm}" rows="#{cc.attrs.rows}"> 

回答

1

這確實是一個不幸的包含EL和複合組件屬性中的數字。這沒有解決方案。當在<f:attribute>中使用時,類型信息在#{cc.attrs}中不可用,因此被視爲String#{15}不能被表示爲EL中的整數,當類型信息不存在時,所有數字總是隱式地被視爲Long。可以通過使用標記文件而不是複合組件來防止ClassCastException

最好的辦法是在實際的rows屬性中進行檢查。

<p:dataTable ... rows="#{cc.attrs.filter ? cc.attrs.rows : null}"> 
+0

謝謝,這是一個合理的解決方法:-) – Thor

+0

不客氣。 – BalusC