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 :

[Spring MVC] Question sur la configuration entre Dispatcher WebApplicationContext et Root WebApplicationContex [Data]


Sujet :

Spring Java

  1. #1
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut [Spring MVC] Question sur la configuration entre Dispatcher WebApplicationContext et Root WebApplicationContex
    Hello à tous je débute sur Spring. J'ai besoin de votre avis sur la configuration de mon application avec Spring MVC + Hibernate + MySQL.

    Mon application fonctionne apparemment, mais je suis confus sur la configuration.

    Pour Spring MVC

    j'ai utilisé la configuration springapp-servlet.xml 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:util="http://www.springframework.org/schema/util"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
     
    	  <bean name="/welcome.htm" class="org.free.tutorial.irnbru.web.controller.WelcomeController"/>
     
    	  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>        
          </bean>
     
          <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/>
    	  <context:component-scan base-package="org.free.tutorial.irnbru"></context:component-scan>
    	  <context:annotation-config/>
    </beans>
    Pour la couche service qui accède à hibernate j'ai créé une autre configuration xml: service-context.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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:util="http://www.springframework.org/schema/util"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
     
    <bean id="masource" class="org.apache.commons.dbcp.BasicDataSource">
    	<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
    	<property name="url" value="jdbc:mysql://localhost/newstranslation"/>
    	<property name="username" value="root"/>
    	<property name="password" value="hyeres"/>
    </bean>
     
    <bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    	<property name="dataSource" ref="masource"></property>
    	<property name="annotatedClasses">
    		<list>
    			<value>org.free.tutorial.irnbru.domain.Source</value>
    			<value>org.free.tutorial.irnbru.domain.Language</value>
    			<value>org.free.tutorial.irnbru.domain.ContentType</value>
    			<value>org.free.tutorial.irnbru.domain.Article</value>
    			<value>org.free.tutorial.irnbru.domain.Author</value>				
    		</list>
    	</property>
    	<property name="hibernateProperties"> 
      		<props>   
       			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
       			<prop key="hibernate.show_sql">true</prop>
     		</props>
     	</property>
    </bean>
     
    <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    	<property name="sessionFactory" ref="sessionfactory"></property>
    </bean>
     
     
    </beans>
    le code de mon service est le 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    package org.free.tutorial.irnbru.service;
     
    import java.util.List;
     
    import org.free.tutorial.irnbru.domain.Source;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
     
    @Service("SourceServiceBean")
    @Transactional
    public class SourceServiceImpl implements SourceService {
     
    	@Autowired
    	private SessionFactory factory;
     
    	@SuppressWarnings("unchecked")
    	@Override
    	public List<Source> findall() {
    		// TODO Auto-generated method stub
    		return factory.getCurrentSession().createQuery("from Source").list();
    	}
     
    }
    le code de mon controlleur est le 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    package org.free.tutorial.irnbru.web.controller;
     
    import java.util.List;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.free.tutorial.irnbru.domain.Source;
    import org.free.tutorial.irnbru.service.SourceService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
     
    public class WelcomeController implements Controller {
     
    	@Autowired
    	private SourceService service;
     
    	private List<Source> sources;
     
    	public SourceService getService() {
    		return service;
    	}
     
    	public void setService(SourceService service) {
    		this.service = service;
    	}
     
    	@Override
    	public ModelAndView handleRequest(HttpServletRequest arg0,
    			HttpServletResponse arg1) throws Exception {
    		setSources(service.findall());
    		return new ModelAndView("welcome","sources",getSources());
    	}
     
    	public void setSources(List<Source> sources) {
    		this.sources = sources;
    	}
     
    	public List<Source> getSources() {
    		return sources;
    	}
     
    }
    Ma question est la suivante pourquoi il est nécessaire de mettre les balises

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/>

    <context:component-scan base-package="org.free.tutorial.irnbru"></context:component-scan>

    <context:annotation-config/>


    dans le fichier de configuration du Dispatcher de Spring MVC (springapp-servlet.xml) et on ne peut pas les laisser dans le fichier de configuration de la couche service (service-context.xml)?

    Par exemple Si je laissais les balises de context dans la configuration service-context.xml alors mon service ne serait pas injecté dans mon contrôleur par l'injection automatique par annotation...

    J'ai donc corrigé en le mettant dans springapp-servlet.xml , mais j'ai pensé que je pouvais laisser la balise <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/> dans la configuration service-context.xml de mon service. Mais lors que je lance l'application une exception est lancée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SEVERE: Servlet.service() for servlet springapp threw exception
    org.hibernate.HibernateException:
     
    No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    C'est comme si les balises de configuration de Spring:

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/>

    <context:component-scan base-package="org.free.tutorial.irnbru"></context:component-scan>

    <context:annotation-config/>

    dans le fichier service-context.xml ne sont pas accessible à partir de la configuration Spring MVC. Pourtant ses beans eux sont accessibles

    En effet DispatcherServlet a un WebApplicationContext qui hérite de tous les beans définis dans le WebApplicationContext racine (parent donc) défini par mon fichier service-context.xml
    . Par contre il n'hériterait pas des balises de configuration "tx", "context" ???

    Merci pour votre aide car je ne sais pas si je m'y suis bien pris.
    IRNBRU

  2. #2
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    please please d'aide

    je suis sur que ce bug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SEVERE: Servlet.service() for servlet springapp threw exception
    org.hibernate.HibernateException:
     
    No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    est fréquent.

    Je l'ai "résolu" en mettant la balise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/>
    dans le fichier de configuration de mon Spring MVC au lieu du fichier de configuration de ma couche service.

    Je ne pense pas qu'il faut procéder ainsi car cette balise est sensée représenter la couche service et non Spring MVC.

    Du coup je suis perplexe et inquiet

    please help Merci d'avance.
    IRNBRU

  3. #3
    Membre confirmé
    Homme Profil pro
    Expert MDE
    Inscrit en
    Janvier 2008
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Expert MDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 183
    Par défaut
    Salut,

    Utilise la balise <import> pour réimporter les contexte au sein des différents modules/contextes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <import resource="classpath:META-INF/spring/monContextDeService.xml"/>
    --
    Charlie Mordant
    Architecte applicatif
    http://media.helloworld.is-an-engineer.com

  4. #4
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    Tcharl Merci pour ta suggestion.
    Je connaissais cette directive mais je ne comprends pas exactement son utilisation et l'implication de cette importation.

    Je sais que le context root de l'application web est chargé en premier. Il sera le parent de la hiérarchie des contexts.

    Puis celui de Spring MVC est chargé. Il sera le fils.

    De plus les beans du context parent sont accessible à partir du context fils. Et non vice versa!

    Mais selon ta suggestion il faut faire appel à import afin que la balise tx:annotation-driven (incluse dans la configuration du context parent) soit prise en compte par le context fils? Et que seul les beans du context parent sont pris en compte par le context fils à moins de préciser cette importation?

    Merci
    IRNBRU

  5. #5
    Membre confirmé
    Homme Profil pro
    Expert MDE
    Inscrit en
    Janvier 2008
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Expert MDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 183
    Par défaut
    Tout dépend de ce que tu as spécifié dans le web.xml: le context mvc ou les deux?

    Si tu n'as spécifié que le mvc il faut utiliser <import> (ma préférence va dans ce sens car on ne peut pas utiliser mvc sans modèle de données dans la plupart des cas).

    Si ton projet est multi-modules (ear/maven), il me semble que le parent ne connait pas automatiquement ses fils.

    Si ta transaction se répand jusqu'au controleur, il parait logique de spécifier la transaction dans le module associé.

  6. #6
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    Tcharl merci pour ton aide précieuse.

    J'ai déclaré le context pour l'application web root (genre utilisation du ContextLoaderListener) et le context pour spring mvc (avec le dispatcherservlet).

    Mon Controleur utilise par IOC le service, hors le service est une classe avec l'annotation @Transactional.

    Ta remarque est interessante
    Si ta transaction se répand jusqu'au controleur, il parait logique de spécifier la transaction dans le module associé.
    Je me demande si la transaction est démarrée au niveau du controleur si le service injecté par IOC est constituée d'une classe annotée @Transactional.

    Je ferai des tests supplémentaires.

    Merci!
    IRNBRU

  7. #7
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    J'ai résolu mon problème. Merci!

    IRNBRU

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

Discussions similaires

  1. [SPRING MVC]Erreur sur un Integer dans un Validator
    Par manuzinho dans le forum Spring Web
    Réponses: 2
    Dernier message: 31/08/2007, 15h58
  2. Réponses: 4
    Dernier message: 26/07/2007, 21h45
  3. question sur la configuration d'un sous-réseau
    Par youp_db dans le forum Hardware
    Réponses: 2
    Dernier message: 03/05/2007, 18h50
  4. Réponses: 1
    Dernier message: 02/05/2007, 12h53
  5. [PHP-JS] Question sur la syntaxe entre PHP et HTML
    Par Diabless6 dans le forum Langage
    Réponses: 8
    Dernier message: 13/04/2007, 13h08

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