IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Weld injection de dépendance paramétrée


Sujet :

Java EE

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Weld injection de dépendance paramétrée
    Bonjour,

    J'essaie depuis un moment de mettre en place une injection paramétrée, mais je n'arrive pas à comprendre comment fonctionne le mécanisme et je n'ai pas réussi à trouver la bonne formule après de multiples essais.

    Le but est de l'utiliser avec un @Produces qui créera un objet "Model" en fonction d'un paramètre "nomModel".

    J'aimerais que l'injection ressemble à cela au final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Inject
    @MessageModel(value = "...")
    Model monModel;
    J'ai donc essayé de modifier l'@interface MessageModel, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
    public @interface MessageModel
    {
            String value(); // OU String modelName();
    }

    Jusqu'ici, tout va bien (du moins je pense). Par contre, je n'ai aucune idée de la manière de faire pour récupérer ce paramètre dans le @Produces.

    J'ai essayé ceci (vu dans la documentation de weld) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class ModelFactory
    {
        @Produces
        @MessageModel (value = "")
        Model createModel(final InjectionPoint ip)
        {
            return (new Model (ip.getAnnotated().getAnnotation(MessageModel.class).value());
        }
    }

    J'ai également essayé quelque chose du genre de (et plusieurs autres variantes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Produces
        @MessageModel
        Model createModel(final InjectionPoint in_injectionPoint, final String value)
        {
            [...]
        }

    Mais je n'obtiens aucun résultat probant ; je me retrouve au mieux avec une dépendance non-satisfaite à l'exécution :

    org.jboss.arquillian.impl.event.FiredEventException: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Model] with qualifiers [@MessageModel] at injection point [[field] @MessageModel @Inject private eu.aznetwork.jazee.sandbox.logs.test.DBTestCase.model]

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonjour,

    Moi, je prendrais ta première variante, mais en ajoutant @Nonbinding sur l'attribut value de l'annotation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
    public @interface MessageModel
    {
            @Nonbinding public String value(); // OU String modelName();
    }
    Et ensuite le même ModelFactory:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class ModelFactory
    {
        @Produces
        @MessageModel (value = "")
        Model createModel(final InjectionPoint ip)
        {
            return (new Model (ip.getAnnotated().getAnnotation(MessageModel.class).value());
        }
    }

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Merci
    Merci, ça a marché, mais il me semblait avoir essayé sans obtenir de résultat probant.

    Pourrait-tu me dire à quoi sert @NonBinding ?
    Personnellement, je croyais que cela influait sur la recherche du beans correspondant à l'annotation (prise en compte ou pas du champs). Mais on dirait que c'est peu être plus important que ça.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par ppyteam Voir le message
    Pourrait-tu me dire à quoi sert @NonBinding ?
    Personnellement, je croyais que cela influait sur la recherche du beans correspondant à l'annotation (prise en compte ou pas du champs). Mais on dirait que c'est peu être plus important que ça.

    Oui, c'est bien comme ça que je le comprend aussi. La Javadoc de @Nonbinding dit:
    Excludes a member of an annotation type (such as a qualifier type or interceptor binding type) from consideration when the container compares two annotation instances.
    Donc, en fait, pour satisfaire l'injection, le container doit faire correspondre la déclaration de la variable membre (type, qualifier...) avec une déclaration de bean ou producer method.

    Dans notre cas, la variable est déclarée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Inject
    @MessageModel(value = "...")
    Model monModel;
    c'est-à-dire, avec une valeur pour l'attribut value, alors que sur la producer method, on a @MessageModel(value = "").

    Pour que le container fasse la correspondance, il faudrait que l'attribut value soit Nonbinding.

    Voilà, je ne sais pas si cette explication est la bonne, mais en tout cas c'est comme cela que je comprend ça.

    La jsr-299 étant encore relativement récente, il manque encore des tutos et autres docs comme il en existe pour les autres technologies Java (comme Spring, pour ne pas le citer...) Mais ça je crois que les développeurs commencent à s'y intéresser de plus en plus.

    Tiens, voilà un tutoriel intéressant.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour le lien, et l'explication

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB3] [JBoss] Injection de dépendance circulaire ?
    Par Claythest dans le forum Java EE
    Réponses: 6
    Dernier message: 04/08/2009, 08h11
  2. [EJB3] Injection de dépendance et Stateful
    Par newbeewan dans le forum Java EE
    Réponses: 1
    Dernier message: 15/05/2007, 07h33
  3. [Séquence] Opérations et inclusion de dépendances (paramètres)
    Par bassim dans le forum Autres Diagrammes
    Réponses: 2
    Dernier message: 06/04/2007, 01h42
  4. [Integration] [EasyMock] Injection de dépendance à l'éxécution
    Par frangin2003 dans le forum Spring
    Réponses: 2
    Dernier message: 06/03/2007, 11h06
  5. Spring + TagSupport et injection de dépendance
    Par worldchampion57 dans le forum Spring Web
    Réponses: 2
    Dernier message: 26/02/2007, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo