4

我正在实现一个 JSF 组件,需要有条件地添加一些属性。这个问题与之前的JSF 类似: p:dataTable with f:attribute results in "argument type mismatch" error,但错误信息完全不同,所以我提出了一个新问题。

<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

如果我直接添加属性,也不例外,并且显示正确的行数:

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

1 回答 1

3

这确实是一个不幸的极端情况,EL 和复合组件属性中有数字。对此没有解决方案。#{cc.attrs}类型信息在使用时不可用<f:attribute>,因此被视为String. 也不能在#{15}EL 中表示为整数,所有数字总是被隐含地视为Long类型信息不存在时。ClassCastException可以通过使用标记文件而不是复合组件来防止这种情况。

您最好的选择是检查实际rows属性本身。

<p:dataTable ... rows="#{cc.attrs.filter ? cc.attrs.rows : null}">
于 2012-10-22T12:47:43.367 回答