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

JSF Java Discussion :

[JSF - Spring] Injecter un bean Spring dans un Converter JSF


Sujet :

JSF Java

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 82
    Points : 78
    Points
    78
    Par défaut [JSF - Spring] Injecter un bean Spring dans un Converter JSF
    Bonjour,

    j'ai écris un converter pour mon appli JSF; ma classe implémente donc l'interface Converter et donc les deux methodes getAsObject et getAsString.

    Pour la méthode getAsObject, j'ai besoin d'un manager de ma couche Service.
    J'ai donc ajouté un attribut manager dans ma classe Converter ainsi qu'un setter approprié.

    J'utilise l'IoC de Spring donc mon objet Manager est un bean declaré dans mon fichier ApplicationContext.xml.

    Dans mon faces-config.xml, j'ai declaré l'element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <application>
            <variable-resolver>
                org.springframework.web.jsf.DelegatingVariableResolver
                </variable-resolver>
            <locale-config/>
        </application>
    qui indique à JSF d'aller chercher les beans qu'il ne trouve pas dans l'applicationContext.xml de Spring.

    J'ai maintenant un problème : je ne sais pas comment faire pour déclarer mon converter de façon à lui injecter mon bean Manager.
    J'ai pour l'instant testé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <converter>
            <converter-id>MonConverter</converter-id>
            <converter-class>com.jsf.MonConverter</converter-class>
            <property>
                <property-name>mgr</property-name>
                <property-class>com.service.Manager</property-class>
                <suggested-value>#{manager}</suggested-value>
            </property>
    </converter>
    et cela ne marche pas, mon mgr dans l'objet MonConverter n'est pas instancié (valeur null).
    J'ai verifié si le setter du manager dans la classe MonConverter etait appelé, et il l'est. Cependant, le parametre du setter est nul.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Je peux te confirmer que cela fonctionne pour les managed-bean mais je n'ai jamais essayé de le faire avec les converters... Des que j'ai plus de temps je m'y adonne!

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 82
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    Je peux te confirmer que cela fonctionne pour les managed-bean mais je n'ai jamais essayé de le faire avec les converters... Des que j'ai plus de temps je m'y adonne!
    Merci pour ton soutien! et je confirme ta confirmation (!) :
    dans mon faces-config.xml, j'ai declaré un managed-bean et je lui ai injecté le même manager que celui que je souhaite injecter dans mon Converter.
    L'injection dans le managed-bean fonctionne, l objet Manager est bien instancié. mais il est toujours null dans le converter...


    Edit :
    pour "resoudre" le probleme, je peux ecrire dans le code du Converter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
    mgr = (Manager) ctx.getBean("manager");
    Avec ça, je recupere bien le manager.
    Mais est ce une solution viable? respecte-t-elle bien l'esprit de IoC?
    J'aurais tendance à dire oui, mais j'aimerais bien que quelqu'un me le confirme
    Et enfin, y a t il un moyen d'injecter ce manager autrement que directement dans le code java?

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 82
    Points : 78
    Points
    78
    Par défaut
    j'ai maintenant un autre problème qui est surement lié à mon premier problème:

    j'ai declaré un managed-bean. Ce managed-bean utilise aussi un objet Manager (le même que se sert mon Converter).
    Pour lui injecter cet objet , j'utilise l'element <managed-property>.
    Jusqu'à aujourd'hui, aucun problème, il recuperait bien le Manager et pouvait s'en servir.
    Aujourd'hui, je decide de changer le scope du managed-bean : il etait avant egal à Request et je le fais passer à Session. et là... l'objet Manager ne s'injecte plus dans mon managed-bean... je n'ai changé que le scope et je ne comprends pas en quoi ca le gene...
    alors je peux toujours utiliser la même solution que j'ai utilisé hier pour mon Converter, c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
    mgr = (Manager) ctx.getBean("manager");
    je vois pas pourquoi je dois faire comme ceci si mon scope est Session... et ce n'est vraiment pas pratique... je preferais utiliser l'injection avec l'element <managed-property>... mais comment faire?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Points : 172
    Points
    172
    Par défaut
    j'ai le même problème. J'ai récupéré un tutoriel sur developpez.net
    , il s'agit de CRUD avec JSF, Spring et Hibernate et il ne marche pas.

    Dans faces-config.xml j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	<managed-bean>
    		<description>
    			Visual Bean with reference on Business Bean.
    		</description>
    		<managed-bean-name>todoBean</managed-bean-name>
    		<managed-bean-class>
    			jotodo.gui.bean.ToDoBean
    		</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    		<managed-property>
    			<property-name>toDoService</property-name>
    			<value>#{toDoService}</value>
    			</managed-property>
    		<managed-property>
    			<property-name>toDoId</property-name>
    			<value>#{param.toDoId}</value>
    		</managed-property>
    	</managed-bean>

    le Bean toDoService est défini dans applicationContext.xml et impossible de l'injecter dans todoBean

    j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    11:07:02,921 ERROR ApplicationImpl:createAndMaybeStoreManagedBeans:260 -Managedbean todoBean could not be created Erreur dans l'expression: Object nommé 'toDoService' ne peut 'tre trouvé.
    javax.faces.el.EvaluationException: Erreur dans l'expression: Object nommé 'toDoService' ne peut 'tre trouvé.
    remarque: dans faces-congif.xml j'ai bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <application>
            <variable-resolver>
                org.springframework.web.jsf.DelegatingVariableResolver
                </variable-resolver>
            <locale-config/>
        </application>

    Autre remarque, quand je démarre Tomcat j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10:50:35,671  INFO DefaultListableBeanFactory:preInstantiateSingletons:268 -Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [dataSource,sessionFactory,jdbcExceptionTranslator,hibernateTemplate,transactionManager,todoDao,toDoServiceTarget,toDoService]; root of BeanFactory hierarchy]
    toDoService fait bien parti des listable beans


    Help please ....

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/07/2011, 14h12
  2. Pb injection bean spring dans un ExceptionHandler
    Par Aurélie38 dans le forum Struts 1
    Réponses: 0
    Dernier message: 04/08/2009, 16h19
  3. Injecter de l'HTML dans une page JSF
    Par ipingu dans le forum JSF
    Réponses: 6
    Dernier message: 14/04/2009, 17h15
  4. [Framework] Injection de Service spring dans un managed bean JSF
    Par _skip dans le forum Spring
    Réponses: 10
    Dernier message: 12/03/2009, 09h28
  5. [Spring + Struts]Injecter un bean dans un plugin Struts
    Par Saverok dans le forum Spring Web
    Réponses: 1
    Dernier message: 18/12/2008, 15h18

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