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 Java Discussion :

[IOC] Spring + Servlet/JSP [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 6
    Par défaut [IOC] Spring + Servlet/JSP
    Bonjour,

    J'aimerais pouvoir instancier automatiquement mes services avec Spring IoC dans une Servlet de base (càd sans Struts, Spring/MVC, etc...).

    Voici mon web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            <context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    			/WEB-INF/applicationContext.xml
    		</param-value>
    	</context-param>
     
    	<listener>
    		<listener-class>
    			org.springframework.web.context.ContextLoaderListener
    		</listener-class>
    	</listener>
    Voici mon applicationContext.xml :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
     
      <bean id="ProductServlet" class="com.catalog.servlet.ProductServlet">
    	<property name="productServices">
    		<ref bean="productServices"/>
    	</property>
      </bean>
     
      <bean id="productServices" class="com.catalog.services.business.impl.ProductServicesImpl">
      </bean>
     
    </beans>

    ProductServlet est une HttpServlet, c'est cette servlet qui utilisera le service productServices.

    Dans la Servlet j'ai le code suivant :

    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
     
    public class ProductServlet extends HttpServlet {
     
    	private IProductServices productServices;
     
    	public void setProductServices(IProductServices productServices) {
    		this.productServices = productServices;
    	}
     
           protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
     
                 // Appel service
                 productServices.getProductForId(id);
     
           }
    }
    Le problème est que j'obtient un NullPointerException, donc mon productServices n'a pas été référencé automatiquement.

    Il est bien instancié en tout cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    12:30:23,500 INFO  [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@10613aa: defining beans [productServices]; root of factory hierarchy
    12:30:23,500 DEBUG [DefaultListableBeanFactory] Creating shared instance of singleton bean 'productServices'
    12:30:23,500 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'productServices'
    12:30:23,547 DEBUG [DefaultListableBeanFactory] Eagerly caching bean 'productServices' to allow for resolving potential circular references
    12:30:23,562 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'productServices'

    Une méthode que j'ai trouvé serait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WebApplicationContext wac =	WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    productServices = (IProductServices) wac.getBean("productServices");

    Mais ca ne me plait pas trop, j'aurais aimé que le productServices soit référencé automatiquement lors de l'instanciation de la Servlet.

    Est-ce possible ?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2008
    Messages : 63
    Par défaut
    Bonjour.

    A ma connaissance, ce n'est pas possible.
    En effet, le serveur d'application n'a pas connaissance du contexte spring et va créer lui même l'instance de la servlet qu'il va utiliser, il ne va pas la récupérer. Ce qui signifie que la servlet que tu places en tant que bean spring ne sera pas la même qui est exécutée.
    La méthode est une solution possible à adopter (une autre serait une ApplicationContextAware mais ça revient au même) : il te faut un accés à la fabrique de bean afin de demander le bean service voulu.

    Si tu veux une solution où l'instance du service est référencée automatique, regarde du coté de Spring MVC.

  3. #3
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    En fait, c'est possible mais cela nécessite une configuration spéciale ( il faut Spring 2.5 je crois et Java 5 ) , avec ce qu'on appelle du load time weaving.


    Pour cela, tu dois ajouter une annotation sur ton bean
    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
    @Configurable
    public class ProductServlet extends HttpServlet {
    	
    	private IProductServices productServices;
     
    	public void setProductServices(IProductServices productServices) {
    		this.productServices = productServices;
    	}
     
           protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
     
                 // Appel service
                 productServices.getProductForId(id);
     
           }
    }
    Ensuite, tu dois ajouter quelques lignes dans ton xml de configuration :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <context:annotation-config /> 
    <aop:aspectj-autoproxy /> 
    <context:load-time-weaver/>

    Et tu dois specifier un paramètre dans le lancement de la JVM ( celle de tomcat, ou autre ) :

    -javaagent:path/to/dist/weaving/spring-agent.jar
    Mais bon, c'est à utiliser vraiment si cela est nécessaire.
    En general, Spring MVC ou bien le WebApplicationContextUtils est plus simple et fonctionne aussi bien
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

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

Discussions similaires

  1. [Servlets - JSP] Problème de session
    Par the java lover dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/11/2011, 09h54
  2. [Framework] (Spring avec servlet+JSP) et AspectJ?
    Par Annsen dans le forum Spring
    Réponses: 10
    Dernier message: 13/07/2010, 10h32
  3. [servlet][JSP] renvoi d'informations
    Par deldin dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 22/06/2004, 13h44
  4. [servlet][jsp] Creer une page de login
    Par Beuj dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 19/03/2004, 17h55
  5. [Servlet][JSP] valeur ajoutée
    Par yolepro dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/03/2004, 17h30

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