2010-09-14 12 views
6

Si je veux créer plus d'une instance de bean géré dans JSF 2.0, sous des noms différents dans la même portée, comment dois-je procéder? Idéalement, je veux que le equivilant à (par exemple):Quelle est la bonne façon de créer plusieurs instances de beans gérés dans JSF 2.0

@ManagedBeans({name="myManagedBean1",name="myManagedBean2"}) 
@RequestScoped 
public class MyManagedBean { 

} 

Merci ..

+0

Je pense que les annotations JSF 2.0 devraient être aussi puissantes que faces-config.xml est déjà en relation avec la création de bean. J'ai utilisé plusieurs beans de la même classe dans JSF 1.2 et il est dommage que JSF2.0 ne vienne pas à bout de cette fonctionnalité avec des annotations. – Puche

Répondre

10

Vous ne pouvez pas. Techniquement, cela n'a pas beaucoup de sens. Vous recherchez probablement une solution dans la mauvaise direction pour l'exigence fonctionnelle particulière.

Votre meilleur pari est d'avoir un parent et avoir ces "fèves multiples" comme enfants.

@ManagedBean 
@RequestScoped 
public class Parent { 
    private Child child1; 
    private Child child2; 
    // ... 
} 

afin que vous puissiez y accéder en #{parent.child1} et #{parent.child2}. Vous pouvez bien sûr également utiliser une propriété List<Child> ou même Map<String, Child> pour être plus flexible.

Avec le faces-config.xml, il est cependant possible de définir plusieurs classes de beans avec un nom différent. Je ne vois toujours pas comment c'est utile.

+0

Merci. L'exigence provient du fait que les beans gérés en question sauvegardent des beans pour des composants personnalisés, dont certains champs sont liés à UIComponents sur la page. Ainsi (albiet en de rares occasions), j'ai besoin de plusieurs instances du même type de backing bean pour plusieurs des mêmes composants, dans ce cas des dialogues d'interface utilisateur. Je pensais que votre solution pouvait être le cas, mais cela ne permettait plus d'utiliser des annotations de cycle de vie telles que @PostConstruct. Merci! – Dave

+0

Vous pouvez ** créer ** plusieurs instances d'un ManagedBean (remplacer le * getValue * de ManagedBeanELResolver). Ils seront construits en utilisant le même BeanBuilder et BeanManager, ils ne diffèrent que par leur beanName. Si c'est nécessaire pour votre solution, je ne sais pas. Dans quelques rares cas, je dirais oui. – Manuel

+0

@Manual: C'est certainement possible. La réponse principale s'applique uniquement à l'utilisation des annotations JSF 2.0 pour atteindre l'objectif, exactement comme demandé par le PO. Notez que le dernier paragraphe de la réponse indique qu'il est possible de définir plusieurs instances en utilisant l'ancienne méthode 'faces-config.xml' à la place. Pour cela, vous n'avez pas besoin de pirater les classes spécifiques à JSF impl. – BalusC

3

Dans votre cas, utilisez le fichier faces-config.xml. Implémentez votre bean sans les annotations ManagedBean et RequestScope. Ainsi, votre bean ne deviendra pas un bean géré par défaut. Vous pouvez utiliser autant de managedBeans que vous le souhaitez avec des noms différents, des portées différentes et des propriétés différentes. Par exemple:

<managed-bean> 
    <managed-bean-name>MyManagedBean1</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>5</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>int</property-class> 
     <value>2</value> 
    </managed-property> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>MyManagedBean2</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>30</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>java.lang.String</property-class> 
     <value>project</value> 
    </managed-property> 
</managed-bean> 

Ne pensez pas que les descripteurs sont mal et annotations sont la seule façon de mettre en œuvre votre code.

3

Une possibilité est de rendre votre classe abstraite et de la sous-classer dans le nombre d'instances nommées dont vous avez besoin, que vous pouvez laisser vide. Cela vous aidera également à séparer les futures fonctionnalités du bean géré, qui ne concernent en réalité que l'un des cas.

Vous devrez déplacer l'annotation @ManagedBean (et la portée) vers toutes les sous-classes, malheureusement, même si c'est @Inherited. Pour la version actuelle de Mojarra atleast, d'autres que je ne connais pas.

+0

Pour mon cas d'utilisation ci-dessus, j'ai décidé d'aller avec cette approche car il y a différents cas d'init pour chaque page web différente comme. Merci. – user3586195