[SPRING] Injetando sessionFactory NULO

7 respostas
G

Bom dia pessoal,

Estou com um problema para injetar um SessionFactory pelo Spring 3 com Hibernate 4, obitdos pelo Maven.

Tenho a seguinte situação, o hiberante esta configurado pelo arquivo “hibernate.cfg.xml” como segue abaixo:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <!-- Session Factory -->
	<session-factory>

		<!-- DADOS CONEXAO -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/sourcesphere_myfinances</property>
		<property name="hibernate.connection.username">myfinances</property>
		<property name="hibernate.connection.password">sourcesphere</property>
 
		<!-- CONFIGURACAO -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<property name="hibernate.default_schema">sourcesphere_myfinances</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.show_sql">false</property>
		<property name="hibernate.format_sql">false</property>
		<property name="hibernate.archive.autodetection">class</property>
			
		<!-- POOL DE CONEXOES -->
		<property name="hibernate.c3p0.min_size">1</property>
		<property name="hibernate.c3p0.max_size">5</property>
		<property name="hibernate.c3p0.timeout">300</property>
		<property name="hibernate.c3p0.max_statements">50</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>

	</session-factory>

</hibernate-configuration>

Esta é a configuração do contexto do Spring:
OBS: Percebam que importei as configurações do hibernate.cfg.xml para o sessionFactory ao invés de criar o dataSource.

<?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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc 
						http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
						http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	
	<!-- Habilita Annotations -->
	<mvc:annotation-driven />
	
	<!-- Base de Pacotes -->
	<context:component-scan base-package="br.com.sourcesphere.myfinances" />
	
	<!-- Pasta de Resources -->
	<mvc:resources location="/resources/" mapping="/resources/**"/>
	
	<!-- View Handler -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<!-- Handler de Upload -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="10000000" />
	</bean>
	
	<!-- Session Factory -->
	<bean id="sessionFactory" autowire-candidate="true" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    </bean>
	
</beans>

E aqui um exemplo de @Autowire, onde a sessionFactory fica nulo:

/**
 * DAO Para testes inicais
 */
@Repository
@Transactional
public class CategoriaDao
{
	@Autowired
	private SessionFactory sessionFactory;
	
	public Categoria salvar(Categoria categoria)
	{
		Transaction transaction = null;
		try 
		{
			transaction = this.getSession().beginTransaction();
			this.getSession().saveOrUpdate(categoria);
			transaction.commit();
		} 
		catch (Exception e) 
		{
			if (transaction != null && transaction.isActive()) 
			{
				transaction.rollback();
			}			
		} 
		return categoria;
	}
	
	private Session getSession()
	{
		return sessionFactory.getCurrentSession();
	}
}

Ao tentar chamar o método salvar, obtenho o seguinte output no console de erro:

SEVERE: Servlet.service() for servlet [springmvc] in context with path [/myfinances] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
	at br.com.sourcesphere.myfinances.dao.CategoriaDao.getSession(CategoriaDao.java:45)
	at br.com.sourcesphere.myfinances.dao.CategoriaDao.salvar(CategoriaDao.java:28)
	at br.com.sourcesphere.myfinances.controller.HomeController.indexAction(HomeController.java:32)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:746)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:687)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Alguém sabe o que pode estar acontecendo para o Spring não injetar o session factory na minha classe ?

Obrigado.

7 Respostas

V

Me parece que falta o DataSource. Dê uma lida nesse tutorial, pode ajudar.

G

Então cara, eu não fiz o datasource justamente por estar usando arquivo externo, como mostra abaixo:

<!-- Session Factory -->  
    <bean id="sessionFactory" autowire-candidate="true" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>  
    </bean>

Este é o hibernate.cfg.xml que é referenciado no bean sessionFactory:

<!-- Session Factory -->  
    <session-factory>  
  
        <!-- DADOS CONEXAO -->  
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/sourcesphere_myfinances</property>  
        <property name="hibernate.connection.username">myfinances</property>  
        <property name="hibernate.connection.password">sourcesphere</property>  
  
        <!-- CONFIGURACAO -->  
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>  
        <property name="hibernate.default_schema">sourcesphere_myfinances</property>  
        <property name="hibernate.hbm2ddl.auto">update</property>  
        <property name="hibernate.show_sql">false</property>  
        <property name="hibernate.format_sql">false</property>  
        <property name="hibernate.archive.autodetection">class</property>  
              
        <!-- POOL DE CONEXOES -->  
        <property name="hibernate.c3p0.min_size">1</property>  
        <property name="hibernate.c3p0.max_size">5</property>  
        <property name="hibernate.c3p0.timeout">300</property>  
        <property name="hibernate.c3p0.max_statements">50</property>  
        <property name="hibernate.c3p0.idle_test_period">3000</property>  
  
    </session-factory>
V

O link que eu passei usa o DataSource E o hibernate.cfg.xml. Esse aquivo não tem a configuração do DataSource, usar o arquivo não o substiui.

G

Modifiquei para a maneira conforme abaixo, porém o session factory continua vindo nulo.

<!-- Datasource p/ conexão -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
		<property name="driverClass" value="com.mysql.jdbc.Driver"/> 
		<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/sourcesphere_myfinances"/> 
		<property name="user" value="myfinances"/> 
		<property name="password" value="sourcesphere"/> 
	</bean>
	
	<!-- Session Factory -->
	<bean id="sessionFactory" autowire-candidate="true" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    </bean>
G

Alguém faz idéia de como proceder ?

F

Também estou com o mesmo problema.

Tenho dois SessionFactory dentro da aplicação. Sendo que um eu não tenho controle dele, porque está dentro de um framework que foi criado aqui no cliente. Este funciona tranquilo, porém o segundo que eu criei está vindo null =/

Meu application.xml do spring

<context:component-scan base-package="br.com.petrobras.simp.persistence"/>
    <context:component-scan base-package="br.com.petrobras.simp.service"/>
    <context:component-scan base-package="br.com.petrobras.fcorp.exceptionhandler"/>
    <context:component-scan base-package="br.com.petrobras.simp.util"/>
    
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="${dsname}"/>
    </bean>
    
    <bean id="dataSourceFTP" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
	 	<property name="driverClassName" value="${hibernate.connection.driver_class}"></property>  
	 	<property name="url" value="${hibernate.connection.url}"></property>  
	 	<property name="username" value="${hibernate.connection.usernamer}"></property>  
	 	<property name="password" value="${hibernate.connection.password}"></property>  
	</bean>  
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" primary="true">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="br.com.petrobras.simp.entity"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            </props>
        </property>
   	</bean>
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <qualifier value="site"/>
        <property name="dataSource" ref="dataSource" />
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
   	
	<bean id="sessionFactoryFTP" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
	 	<property name="dataSource" ref="dataSourceFTP"></property>
	 	<property name="packagesToScan" value="br.com.petrobras.simp.entity.bdemq"></property>  
	 	<property name="hibernateProperties">  
		 	<props>  
				  <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
	        </props>  
      	</property>  
	</bean>  
  	
	<bean id="transactionManagerFTP" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactoryFTP"></property>  
	</bean>

A configuração está dentro de um properties (config.properties)

A Classe que pega o SessionFactoryFTP

@Repository
public class PegarSessao {
	
	@Autowired
	@Qualifier("sessionFactoryFTP")
	private SessionFactory bdemqSessionFactory;

	/**
	 * @return the bdemqSessionFactory
	 */
	public Session getCurrentSessionFactory() {
		bdemqSessionFactory = new Configuration().configure().buildSessionFactory();
		return bdemqSessionFactory.openSession();
	}

	/**
	 * @return the bdemqSessionFactory
	 */
	public SessionFactory getBdemqSessionFactory() {
		return bdemqSessionFactory;
	}

	/**
	 * @param bdemqSessionFactory the bdemqSessionFactory to set
	 */
	public void setBdemqSessionFactory(SessionFactory bdemqSessionFactory) {
		this.bdemqSessionFactory = bdemqSessionFactory;
	}
}

Já fiz tudo quanto é configuração possível e dá nullpointer :frowning:

se tiro o primary = “true” do primeiro sessionFactory, da erro ao iniciar a aplicação dizendo que tem dois beans sendo criado e tals…

J

Conseguiram resolver este tópico? Tenho o mesmo erro. Obrigado!

Criado 28 de janeiro de 2013
Ultima resposta 28 de jan. de 2016
Respostas 7
Participantes 4