7
votes

Quelle est la bonne façon de créer plusieurs instances de haricots gérés dans JSF 2.0

Si je veux créer plus d'une instance de haricot géré dans JSF 2.0, sous différents noms de la même portée, comment devrais-je continuer? Idéalement, je veux l'équivalant à (par exemple): xxx

merci ..


1 commentaires

Je pense que JSF 2.0 Annotations devrait être aussi puissante que les faces-config.xml est déjà par rapport à la création de beans. J'utilise plusieurs haricots de la même classe dans JSF 1.2 et c'est une pitié JSF2.0 ne surmonte pas cette fonctionnalité avec des annotations.


3 Réponses :


11
votes

Vous ne pouvez pas. Techniquement, il 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 une haricot mère et d'avoir ces "grains multiples" comme des enfants. xxx

afin que vous puissiez y accéder par # {parent .child1} et # {parent.child2} . Vous pouvez bien sûr utiliser également une propriété list ou même mappe plutôt être plus flexible.

avec le < Code> faces-config.xml Il est cependant possible de définir plusieurs classes de haricots avec un nom différent. Néanmoins, je ne vois pas comment c'est utile.


4 commentaires

Merci. L'exigence découle des haricots gérés en question étant des haricots soumis à des composants personnalisés, qui ont des champs liés aux uicomponents sur la page. Ainsi (Albiet à des reprises rares), j'ai besoin d'une instance multiple du même type de haricot de support pour plusieurs des mêmes composants, dans ce cas, des dialogues d'interface utilisateur. Je pensais que votre solution pourrait être le cas, mais cela laisse alors il ne laisse pas d'utiliser des annotations de cycle de vie telles que @postConstruct. Merci!


Vous peut Créer plusieurs instances d'un ganteanbean (Remplacement de la getvalue getvalue ). Ils seront construits en utilisant le même haricot et le même beanManager, ils vont juste différer dans leur nom de haricot. Si cela est nécessaire pour votre solution, je ne sais pas. Dans certains cas rares, je dirais oui.


@Manual: C'est sûrement possible. La réponse principale s'applique simplement à l'utilisation de JSF 2.0 Annotations pour atteindre l'objectif, exactement comme l'OP demanda. Notez que le dernier paragraphe de la réponse stipule qu'il est possible de définir plusieurs instances lors de l'utilisation de l'ancien faces-config.xml voie plutôt. Pour cela, vous n'avez pas besoin de pirater les classes spécifiques à la JSF implémente.


Un cas d'utilisation pour moi, est un critère de recherche couramment des critères de recherche. Ce haricot stocke des critères de recherche d'utilisateur. J'aime conserver les critères pour faciliter la tâche de l'utilisateur lorsqu'il retourne sur la même page Web. Cependant, j'ai peut-être besoin du même bean de recherche dans différentes pages Web. Par conséquent, je ne veux pas que les critères de recherche soient modifiés pour chaque page. D'où le même haricot avec un nom différent pour moi.



3
votes

Dans votre cas, vous devez utiliser les faces-config.xml. Implémentez votre haricot sans l'annotation Gestiondbean et DemandeScope. Donc, votre haricot ne deviendra pas un haricot géré par défaut. Vous pouvez également insérer autant de gènes dont vous avez besoin avec des noms différents, des différentes étendues et des propriétés différentes de bail. 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>


0 commentaires

3
votes

Une possibilité est de rendre votre classe de classe et de la sous-classer dans autant d'instances nommées que nécessaire, que vous pouvez laisser vide. Cela vous aidera également à séparer les futures fonctionnalités de haricots gérées qui ne concernent que l'un des cas.

Vous devrez déplacer l'annotation @managedbean (et la portée) à toutes les sous-classes, malheureusement, même s'il est @ hérité. Pour la version actuelle de Mojarra Au moins, d'autres je ne sais pas.


1 commentaires

Pour mon cas d'utilisation ci-dessus, j'ai décidé d'aller avec cette approche car il existe différents cas d'introduction pour chaque page Web différente, telle que. Merci.