2010-06-24 4 views
3

Si j'avais un bean géré comme suit:JSF2: limitation cc: attribut à un type d'objet donné dans une liste

@ManagedBean 
@RequestSchoped 
public class Example { 

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

    // getters, setters, etc. down here 
} 

et avait un composant personnalisé qui a accepté une liste comme un attribut:

<?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> 

Comment pourrais-je faire en sorte que cela a fonctionné:

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

mais cela n'a pas:

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

En d'autres termes, ce que je veux faire pour le cc:attribute est la suivante:

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

Cependant, comme nous le savons xhtml ne prend pas de bien vouloir d'utiliser > ou <. De plus, avec Generics n'étant vérifié que lors de la compilation, je ne sais pas comment cela serait fait. Est-ce que quelqu'un sait si c'est possible?

Répondre

2

Vous pouvez vérifier le type de chaque élément en utilisant #{item.class.name}. Le Class#getName() renvoie un String indiquant le type. Par exemple. java.lang.String ou java.lang.Long. Vous pouvez l'utiliser dans l'attribut rendered.

Ajoutez un attribut supplémentaire indiquant le nom complet de la classe.

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

en combinaison avec

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

et cette logique 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

Cette solution semble fermer les yeux pour vous cacher. Cela ne résout pas le problème, mais il est plus difficile de comprendre la cause à l'avenir. –

2

Si vous êtes celui qui produit ces listes alors la suivante pourrait être une solution triviale:

interface StringList extends List<String> {} 

class ArrayStringList extends ArrayList<String> implements StringList {} 

Pas trop élégante cependant.

Je pense que nous avons atteint les limites du langage Java ici. J'ai rencontré le même problème, et n'a pas pu trouver une meilleure solution non plus ...

Questions connexes