Bonjour à tous,

Après avoir écumé tous les forums d'internet (au moins), j'en viens à vous afin de résoudre mon problème de NullPointerException (l'un ou l'autre, même cause, différents effets )

Le contexte est le suivant, nous sommes en train de développer une application web avec spring 2.5/hibernate (3.3).

Tout allait bien jusqu'à quelques jours où nous avons rencontré des problèmes de performances: forcément, à force les relations à lazy="false" dans les mappings hibernate, il arrive un moment où on commence à être un peu juste en mémoire.

Donc j'ai commencé à passer certains champs à lazy="true" et... c'est là que les problèmes sont apparus.

J'ai commencé à mettre en place un intercepteur OpenSessionInView (osiv) dans l'application:

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
<?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:context="http://www.springframework.org/schema/context"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<property name="url">
			<bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName">
                   <value>java:comp/env/url</value>
                </property>
            </bean>
		</property>
		<property name="username">
			 <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName">
                   <value>java:comp/env/login</value>
                </property>
            </bean>
		</property>
		<property name="password">
			 <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName">
                   <value>java:comp/env/pwd</value>
                </property>
            </bean>
		</property>
	</bean>
 
	<!-- ON ACTIVE LES TRANSACTIONS VIA LES ANNOTATIONS -->
	<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="properties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
				<prop key="hibernate.show_sql">false</prop>
 
				<!-- Gestion du cache -->
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.second_level_cache">true</prop>
				<prop key="hibernate.use_query_cache">true</prop>
				<prop key="net.sf.ehcache.configurationResourceName">/conf/ehcache.xml</prop>
				<prop key="hibernate.generate_statistics">true</prop>
				<prop key="hibernate.cache.use_structured_entries">true</prop>				
			</props>
		</property>
	</bean>
 
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="mappingLocations">
		 	<value>classpath*:hibernate/**/*.hbm.xml</value>
		 </property>
		<property name="dataSource" ref="dataSource"></property>
		<property name="hibernateProperties" ref="hibernateProperties" />
	</bean>
 
	<!--  Web Interceptors -->
	<bean id="openSessionInViewInterceptor"
	    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
	    <property name="sessionFactory">
	        <ref local="sessionFactory"/>
	    </property>
	    <property name="flushModeName">
	        <value>FLUSH_AUTO</value>
	    </property>
	</bean>
</beans>
J'ai ensuite modifié le "PersistenceContext" (Extended) de mes services ainsi:

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
 
@Service("I_AccountService")
@RemotingDestination(value = "accountDest", channels = {"my-amf" })
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
@PersistenceContext(type = PersistenceContextType.EXTENDED)
public class AccountService extends IndividuService  implements I_AccountService {
 
	/**
         * DAO individu.
         */
	@Autowired
	private IndividuDAO individuDAO;
 
	/**
         * Methode get.
         * @param id identifiant du compte
         * @return individu
         */
	public Individu get(Integer id) {
		return individuDAO.get(id);
	}
 
	/**
         * Recherche par login.
         * @param login login
         * @return individu
         */
	public Individu findByLogin(String login) {
		return individuDAO.findByLogin(login);
	}
}
Tout fonctionne bien en fait jusqu'à ce que je change de page. Lorsque l'application tente de faire un flush (grace au mode "auto" définit dans la configuration), j'ai une magnifique NullPointerException:

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
java.lang.NullPointerException
	org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
	org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor.postHandle(OpenSessionInViewInterceptor.java:181)
	org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter.postHandle(WebRequestHandlerInterceptorAdapter.java:61)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:886)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)
	org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
	org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.rememberme.RememberMeProcessingFilter.doFilterHttp(RememberMeProcessingFilter.java:116)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.basicauth.BasicProcessingFilter.doFilterHttp(BasicProcessingFilter.java:174)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:278)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
	org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
Malgré mes différentes recherches, je n'ai pas pu trouver de correctif.

D'avance merci pour votre aide !