2010-06-24 35 views
3

如果我有一個managed bean如下:JSF2:限制性的cc:屬性到一個給定的對象類型的列表內

@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不善待使用>或<。而且,只有在編譯時才檢查泛型,我不確定這將如何完成。有誰知道這是否可能?

回答

2

您可以使用#{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>  
+1

這個方案好像閉上眼睛隱藏自己。它不能解決問題,只會使得未來找出原因更加困難。 – 2017-11-06 16:53:59

2

如果你是一個生產這些列表那麼下面可能是一個微不足道的解決方案:

interface StringList extends List<String> {} 

class ArrayStringList extends ArrayList<String> implements StringList {} 

不太優雅,但。

我想我們已經在這裏達到了Java語言的界限。我遇到了同樣的問題,並找不到更好的解決方案...

相關問題