6

次のようなマネージド Bean があるとします。

@ManagedBean
@RequestSchoped
public class Example {

    private List<String> stringList;
    private List<Long> longList;

    // getters, setters, etc. down here
}

リストを属性として受け入れるカスタムコンポーネントがありました:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:h="http://java.sun.com/jsf/html">

  <!-- INTERFACE -->
  <cc:interface>
      <cc:attribute name="aList" type="java.util.List" />
  </cc:interface>

  <cc:implementation>
      <!-- code is in here -->
  </cc:implementation>
</html>

これが機能することを確認するにはどうすればよいですか:

<myComp:previousComponent aList="#{example.stringList}" />

しかし、これはしませんでした:

<myComp:previousComponent aList="#{example.longList}" />

つまり、私がしたいことは次のcc:attributeとおりです。

<cc:attribute name="aList" type="java.util.List<java.lang.String>" />

しかし、私たちが知っているように、xhtml は > や < の使用に親切ではありません。また、ジェネリックはコンパイル時にのみチェックされるため、これがどのように行われるかわかりません。これが可能かどうか誰にもわかりますか?

4

2 に答える 2

5

を使用して、各アイテムのタイプを確認できます#{item.class.name}。はタイプを示すをClass#getName()返します。Stringjava.lang.Stringまたはjava.lang.Longrendered属性でそれを利用することができます。

完全修飾クラス名を示す属性を追加します。

<my:comp list="#{bean.list}" type="java.lang.String" />

と組み合わせて

<cc:attribute name="list" type="java.util.List" required="true" />
<cc:attribute name="type" type="java.util.String" required="true" />

そしてこのロジックはcc:implementation

<ul>
    <ui:repeat value="#{cc.attrs.list}" var="item">
        <h:panelGroup rendered="#{item.class.name == cc.attrs.type}">
            <li>#{item}</li>
        </h:panelGroup>
    </ui:repeat>
</ul>    
于 2010-08-12T17:54:28.770 に答える
4

あなたがこれらのリストを作成している場合、次のことが簡単な解決策になる可能性があります。

interface StringList extends List<String> {}

class ArrayStringList extends ArrayList<String> implements StringList {}

エレガントすぎないけど。

ここで Java 言語の限界に達したと思います。私は同じ問題に遭遇しましたが、より良い解決策も見つかりませんでした...

于 2010-07-31T07:04:37.130 に答える