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