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

Spring Web Java Discussion :

[Servlet] Recuperer la factory initialisée


Sujet :

Spring Web Java

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut [Servlet] Recuperer la factory initialisée
    salut
    g un site web qui utilise Spring pour appeler des EJB
    Mais le pb c'est qu'à chaque requete où g besoin de spring, je crée une factory (org.springframework.beans.factory.xml.XmlBeanFactory) pour récupérer le bean voulu (puis les dependances sont chargées en meme temps au fur et a mesure).

    Il doit y avoir une solution en initialisant la factory au début, puis en le recuperant par le contexte de l'appli web...
    g pas essayé cette solution parce que g vu qu'on pouvait utiliser une servlet ou un listener de Spring...

    C'est ce que g fait, mais comment récupere t'on les beans maintenant?

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    finalement j'utilise le DefaultListableBeanFactory d'apres les logs au deploiement:

    17:19:07,125 INFO [[/WebJaas]] Loading Spring root WebApplicationContext
    17:19:07,140 INFO [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/beans.xml]
    17:19:07,265 INFO [XmlWebApplicationContext] Bean factory for application context [Root WebApplicationContext]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [myHello,myLogin,myTest]; root of BeanFactory hierarchy
    17:19:07,265 INFO [XmlWebApplicationContext] 3 beans defined in application context [Root WebApplicationContext]
    17:19:07,265 INFO [XmlWebApplicationContext] Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@1710065]
    17:19:07,265 INFO [XmlWebApplicationContext] Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@1d0f0db]
    17:19:07,265 INFO [UiApplicationContextUtils] No ThemeSource found for [Root WebApplicationContext]: using ResourceBundleThemeSource
    17:19:07,265 INFO [DefaultListableBeanFactory] Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [myHello,myLogin,myTest]; root of BeanFactory hierarchy]
    17:19:07,265 INFO [DefaultListableBeanFactory] Creating shared instance of singleton bean 'myHello'
    17:19:07,578 INFO [DefaultListableBeanFactory] Creating shared instance of singleton bean 'myLogin'
    17:19:07,593 INFO [DefaultListableBeanFactory] Creating shared instance of singleton bean 'myTest'
    17:19:07,609 INFO [ContextLoader] Using context class [org.springframework.web.context.support.XmlWebApplicationContext] for root WebApplicationContext
    17:19:07,609 INFO [ContextLoader] Root WebApplicationContext: initialization completed in 484 ms



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    client = (SpringClient) factory.getBean("myTest");
    il me sort
    17:19:19,343 ERROR [StandardWrapper[/WebJaas:jsp]] Servlet.service() for servlet jsp threw exception
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myTest' is defined: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans []; root of BeanFactory hierarchy
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:351)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:635)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:146)
    at spring2.SpringTest.<init>(SpringTest.java:33)
    at org.apache.jsp.testEJB_jsp._jspService(org.apache.jsp.testEJB_jsp:110)
    ...

    je vois pas comment faire

  3. #3
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Si tu as déclaré un contrôleur Spring, tu peux utiliser ce type de code :

    this.getApplicationContext().getBean(...)

    Ce code provient de ma classe "public class SpringappController extends MultiActionController"

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    ok merci

    et est ce que l'on peut acceder à ce ApplicationContext en dehors d'un controler spring-mvc: une servlet/jsp par exemple (meme si c pas propre, c'est por faire des test)

  5. #5
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Mais le truc c'est que la servlet/contrôleur Spring est chargée au startup et elle lit le fichier de configuration et stocke la BeanFactory dans un attribut.
    Tu peux donc faire la même chose !

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    d'acord mais g simplement ajouter un listerner Spring qui initialise le fichier bean, et les beans se charge correctement vu les logs.

    Maintenant, dans une servlet quelconque, comment je peux retrouvermes beans? Est ce que je suis obligé d'etre dans un controler spring mvc?
    je sais pas si je suis clair...

    par exemple, g un WS avec plusieurs méthodes. Chaque méthode a besoin de une plusieurs classes métiers... Comment ces méthodes vont faire appel à leurs implémentation, si au moment du deploiement du WS, j'ai configuré un listener dpring?

  7. #7
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Il te faut stocker ta BeanFactory en Session par exemple. Ainsi, tu la retrouveras depuis n'importe quelle servlet

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    d'abord ego, merci pour tes réponses! En + c toi qui m'a convaincu de passer du coté de Spring, il y a qq semaine deja

    1) ok, je vais meme la mettre au niveau application si c une jsp/servlet...
    2) je ne sais pas si je peux le recuperer dans le cas d'un WS: sous jboss, un WS c comme une appli web, cad que je le deploie une servlet (et je peux y rajouter le listener). Par contre je ne vois pas comment recuperer dans le code lui meme... ca c un autre pb...!


    Mais déja, dans le cas (1), g l'impression que mon BeanFactory (DefaultListableBeanFactory précisement) n'est pas le meme que celui qui a été creé au demarage: d'ailleurs c logique, je fais un new() sans rien présiser au constructeur, donc il ignore tout de mes beans (voir l'erreur)

    Ce que je cherche à recuperer, c'est la référence vers le beanfactory qui a été initialisé au demarage de l'appli par le listener (voir extrait du logs plus haut) et a déjé instantié les beans:
    17:19:07,265 INFO [DefaultListableBeanFactory] Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [myHello,myLogin,myTest]; root of BeanFactory hierarchy]

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    bon, apres avoir jeté un coup d'oeil sur les sources, je ne penses pas qu'il faille creer directement un DefaultListableBeanFactory.

    Est ce que vous savez comment récuperer une référence sur la factory initialisée au demarage de l'appli?

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    ca y est g la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Il faut récuperer le contexte
    ServletContext servletCtx =  session.getServletContext();
    ApplicationContext springCtx = WebApplicationContextUtils.getWebApplicationContext(servletCtx);
    ensuite on peut utiliser springCtx pour charger des beans par exemple...[/quote]

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

Discussions similaires

  1. [jsp][servlet]pb recuperation de parametre
    Par alexandra_ape dans le forum Servlets/JSP
    Réponses: 23
    Dernier message: 19/11/2008, 09h10
  2. [Servlet] recuperer fichier xml depuis AJAX
    Par robocop2776 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 13/08/2008, 14h51
  3. Réponses: 5
    Dernier message: 28/03/2006, 09h33
  4. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 13h47
  5. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12

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