Bonjours à tous !

Bien que j'ai déjà utilisé une fois Spring dans le passé, je ne me souviens pas de tout... J'ai commencé une application Web Google App Engine en n'utilisant que les standards tels que les JSP, Servlets et JDO. Maintenant que tout tourne, je voulais y implémenter d'abord Spring IoC, et ensuite Spring MVC, tout cela à des fins éducatives pour moi :-)

Voilà mon problème :

Tout est configuré, le conteneur démarre correctement. Mais lorsque je tente d'accéder à une page, j'ai un NullPointer sur les DAO qui sont sensé être injectés par Spring... Pourtant, d'après le log, tout me semble correct !

Quelqu'un a une idée ?

web.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
...
<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>
...
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
<?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-3.0.xsd">
 
	<!-- PERSISTENCE MANAGER FACTORY -->
	<bean id="persistenceManagerFactory"
	    class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
		<property name="persistenceManagerFactoryName" value="transactions-optional" />
	</bean>
 
	<import resource="daos.xml" />
	<import resource="servlets.xml" />
</beans>
daos.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
<?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-3.0.xsd">
 
	<bean id="CategoriesDao" class="be.jrousseau.gwtsite.server.dao.implementations.CategoriesDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="CompetencesDao" class="be.jrousseau.gwtsite.server.dao.implementations.CompetencesDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="ExperiencesDao" class="be.jrousseau.gwtsite.server.dao.implementations.ExperiencesDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="FormationsDao" class="be.jrousseau.gwtsite.server.dao.implementations.FormationsDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="IntrosDao" class="be.jrousseau.gwtsite.server.dao.implementations.IntrosDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="LanguagesDao" class="be.jrousseau.gwtsite.server.dao.implementations.LanguagesDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="LoisirsDao" class="be.jrousseau.gwtsite.server.dao.implementations.LoisirsDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="PersosDao" class="be.jrousseau.gwtsite.server.dao.implementations.PersosDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
	<bean id="ProjectsDao" class="be.jrousseau.gwtsite.server.dao.implementations.ProjectsDaoImpl">
		<property name="pmf" ref="persistenceManagerFactory" />
	</bean>
</beans>
servlets.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
47
48
49
50
51
<?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-3.0.xsd">
 
	<bean id="AdminCategoriesServlet" class="be.jrousseau.gwtsite.server.servlets.AdminCategoriesServlet">
		<property name="categoriesDao" ref="CategoriesDao" />
	</bean>
	<bean id="AdminCompetencesServlet" class="be.jrousseau.gwtsite.server.servlets.AdminCompetencesServlet">
		<property name="competencesDao" ref="CompetencesDao" />
		<property name="categoriesDao" ref="CategoriesDao" />
	</bean>
	<bean id="AdminExperiencesServlet" class="be.jrousseau.gwtsite.server.servlets.AdminExperiencesServlet">
		<property name="experiencesDao" ref="ExperiencesDao" />
	</bean>
	<bean id="AdminFormationsServlet" class="be.jrousseau.gwtsite.server.servlets.AdminFormationsServlet">
		<property name="formationsDao" ref="FormationsDao" />
	</bean>
	<bean id="AdminIntrosServlet" class="be.jrousseau.gwtsite.server.servlets.AdminIntrosServlet">
		<property name="introsDao" ref="IntrosDao" />
	</bean>
	<bean id="AdminLanguagesServlet" class="be.jrousseau.gwtsite.server.servlets.AdminLanguagesServlet">
		<property name="languagesDao" ref="LanguagesDao" />
	</bean>
	<bean id="AdminLoisirsServlet" class="be.jrousseau.gwtsite.server.servlets.AdminLoisirsServlet">
		<property name="loisirsDao" ref="LoisirsDao" />
	</bean>
	<bean id="AdminPersosServlet" class="be.jrousseau.gwtsite.server.servlets.AdminPersosServlet">
		<property name="persosDao" ref="PersosDao" />
	</bean>
	<bean id="AdminProjectsServlet" class="be.jrousseau.gwtsite.server.servlets.AdminProjectsServlet">
		<property name="projectsDao" ref="ProjectsDao" />
		<property name="experiencesDao" ref="ExperiencesDao" />
	</bean>
	<bean id="AdminServlet" class="be.jrousseau.gwtsite.server.servlets.AdminServlet">
	</bean>
	<bean id="ContactServlet" class="be.jrousseau.gwtsite.server.servlets.ContactServlet">
	</bean>
	<bean id="CurriculumServlet" class="be.jrousseau.gwtsite.server.servlets.CurriculumServlet">
		<property name="formationsDao" ref="FormationsDao" />
		<property name="experiencesDao" ref="ExperiencesDao" />
		<property name="languagesDao" ref="LanguagesDao" />
		<property name="loisirsDao" ref="LoisirsDao" />
		<property name="persosDao" ref="PersosDao" />
	</bean>
	<bean id="IndexServlet" class="be.jrousseau.gwtsite.server.servlets.IndexServlet">
		<property name="introsDao" ref="IntrosDao" />
		<property name="categoriesDao" ref="CategoriesDao" />
	</bean>
</beans>
Log :
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Jun 2, 2010 1:31:22 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Jun 2, 2010 1:31:22 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed C:\Users\Jonathan\workspace-java\mygwtsite\war\WEB-INF/appengine-web.xml
Jun 2, 2010 1:31:22 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed C:\Users\Jonathan\workspace-java\mygwtsite\war\WEB-INF/web.xml
Bad level value for property: .level
Jun 2, 2010 1:31:22 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: jetty-6.1.x
Jun 2, 2010 1:31:25 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
INFO: [1275485485220000] javax.servlet.ServletContext log: Initializing Spring root WebApplicationContext
Jun 2, 2010 1:31:25 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Jun 2, 2010 1:31:25 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Wed Jun 02 13:31:25 UTC 2010]; root of context hierarchy
Jun 2, 2010 1:31:26 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
Jun 2, 2010 1:31:26 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/daos.xml]
Jun 2, 2010 1:31:26 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/servlets.xml]
Jun 2, 2010 1:31:27 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@67a5fb5a: defining beans [persistenceManagerFactory,CategoriesDao,CompetencesDao,ExperiencesDao,FormationsDao,IntrosDao,LanguagesDao,LoisirsDao,PersosDao,ProjectsDao,AdminCategoriesServlet,AdminCompetencesServlet,AdminExperiencesServlet,AdminFormationsServlet,AdminIntrosServlet,AdminLanguagesServlet,AdminLoisirsServlet,AdminPersosServlet,AdminProjectsServlet,AdminServlet,ContactServlet,CurriculumServlet,IndexServlet]; root of factory hierarchy
Jun 2, 2010 1:31:27 PM org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean afterPropertiesSet
INFO: Building new JDO PersistenceManagerFactory for name 'transactions-optional'
Jun 2, 2010 1:31:31 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 6212 ms
Jun 2, 2010 1:31:32 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Started SelectChannelConnector@127.0.0.1:8888
Jun 2, 2010 1:31:32 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The server is running at http://localhost:8888/
Jun 2, 2010 1:32:21 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /
java.lang.NullPointerException
	at be.jrousseau.gwtsite.server.servlets.IndexServlet.doGet(IndexServlet.java:30)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
	at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)