4

JSFコンポーネントを実装していて、条件付きでいくつかの属性を追加する必要があります。この質問は以前のJSFに似ています。f:attributeを指定したp:dataTableでは「引数タイプの不一致」エラーが発生しますが、エラーメッセージがまったく異なるため、新しい質問を作成しました。

<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 に答える