6

如果我有一个托管 bean,如下所示:

@ManagedBean
@RequestSchoped
public class Example {

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

    // getters, setters, etc. down here
}

并有一个自定义组件接受 List 作为属性:

<?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()返回一个String表示类型。例如java.lang.Stringjava.lang.Long。您可以在rendered属性中使用它。

添加一个额外的属性来表示完全限定的类名。

<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 回答