【问题标题】:Null pointer exception thrown by sessionfactory in spring and hibernatesessionfactory在spring和hibernate中抛出空指针异常
【发布时间】:2015-11-21 13:40:45
【问题描述】:

分配会话工厂时出现异常

 java.lang.NullPointerException
    at com.span.hotelmanagement.persistance.CustomerDAOImpl.saveCustomer(CustomerDAOImpl.java:41)
    at com.span.hotelmanagement.business.CustomerRequestManagerImpl.saveUser(CustomerRequestManagerImpl.java:30)

    at com.span.hotelmanagement.controller.CustomerBean.saveCustomer(CustomerBean.java:121)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328)
    at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:273)
    at org.jboss.el.parser.AstMethodSuffix.getValue(AstMethodSuffix.java:59)
    at org.jboss.el.parser.AstMethodSuffix.invoke(AstMethodSuffix.java:65)
    at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
    at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:775)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

ApplicationContext xml

<?xml version="1.0"?>

<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:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.2.xsd 
	http://www.springframework.org/schema/jee 
	http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
	http://www.springframework.org/schema/task
	http://www.springframework.org/schema/task/spring-task-3.2.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-3.0.xsd">
		
	<context:component-scan base-package="com.span.hotelmanagement">
	 <context:include-filter type="aspectj" expression="com.span.hotelmanagement.*" />
</context:component-scan>
	<context:annotation-config />
	<!-- Newly changed query -->
	<!-- <context:property-placeholder location=classpath:database.properties/> -->
	
	<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}"
			p:password="${jdbc.password}"/>-->
	
	   <!-- Create DataSource Bean -->
      
   <!--   <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/TestDB"/>
    </bean> 
     -->
	<!-- <jee:jndi-lookup id="dataSource"
	   jndi-name="java:comp/env/jdbc/hotelmanagement" expected-type="javax.sql.DataSource" />
	    -->
	    
	    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/hotelmanagement" />
    <property name="username" value="root" />
    <property name="password" value="Root@1234" />
   </bean>
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		
		 <property name="configLocation">
			<value>./WEB-INF/hibernate.cfg.xml</value>
		</property> 
		<!-- <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property> -->
		<property name="hibernateProperties">
			<map>
				<entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
				<entry key="hibernate.show_sql" value="true" />
				<!-- <entry key="hibernate.hbm2ddl.auto" value="create"/> -->
			</map>
		</property>
	</bean>
	<tx:annotation-driven/> <!--transaction-manager="transactionManager"--> 
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
       			p:sessionFactory-ref="sessionFactory" />   
	<!-- <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
		<property name="scopes">
			<map>
				<entry key="view">
					<bean class="com.span.hotelmanagement.common.SpringViewScoped" />
				</entry>
			</map>
		</property>
	</bean> -->
	
 	 <bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="cache" value="true" />
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		
	</bean>
	
	
	<task:annotation-driven />
</beans>

Customer DAO Impl 类

    package com.span.hotelmanagement.persistance;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.span.hotelmanagement.entity.CustomerEntry;

@Repository
public class CustomerDAOImpl extends AbstractGenericDAOHibernate<CustomerEntry, Long> 
implements CustomerDAO,Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -276032705968481483L;

/*  @Autowired
    @Qualifier("sessionFactory")
    public SessionFactory sessionFactory;*/

    public void deleteCustomer(CustomerEntry customer) {


    }

    public CustomerEntry saveCustomer(CustomerEntry customer) {

        CustomerEntry cObj=null;
        Session session =null;
        try
        {
            session = sessionFactory.getCurrentSession();

            AbstHibernateUtil.CreateSession(sessionFactory);
            AbstHibernateUtil.beginTransaction();
            if(customer != null)
            {
                cObj= new CustomerEntry();
                cObj=(CustomerEntry)save(customer);
            }
            //AbstHibernateUtil.commit();
        }
        catch(Exception e)
        {
        e.printStackTrace();
        }
        finally{
            AbstHibernateUtil.endTransaction();
            AbstHibernateUtil.closeSession();
        }
        return cObj;
    }

    public List<CustomerEntry> getCategoryList() {
        return null;
    }
    // TODO Auto-generated method stub


}

在调试代码时 seesionFactoru.getsession 返回空值。请帮助我,因为它正在停止进一步的实施

【问题讨论】:

  • 请提供您的CustomerDAOImpl 和spring 配置,并说明您要实现的目标。发布唯一的例外应该使这个问题关闭。
  • 嗨,我已经发布了所有相关的课程

标签: java spring hibernate sessionfactory


【解决方案1】:

好的,所以你的 spring 配置中有这个:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />

         <property name="configLocation">
            <value>./WEB-INF/hibernate.cfg.xml</value>
        </property> 
        <!-- <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property> -->
        <property name="hibernateProperties">
            <map>
                <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
                <entry key="hibernate.show_sql" value="true" />
                <!-- <entry key="hibernate.hbm2ddl.auto" value="create"/> -->
            </map>
        </property>
    </bean>

这意味着 spring 正在管理你的 sessionFactory。

但是在你的代码中你有这样的东西(这是很大的不,不):

//What is this ? You dont need to care about creating session here otherwise you will have serious problem with transaction management and besides that you can see other exceptions
 AbstHibernateUtil.CreateSession(sessionFactory);

它应该是什么样子:

    @Repository
    @Transactional
    public class CustomerDAOImpl extends AbstractGenericDAOHibernate<CustomerEntry, Long> 
    implements CustomerDAO,Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -276032705968481483L;

    @Autowired
    @Qualifier("sessionFactory")
    public SessionFactory sessionFactory;

    public void deleteCustomer(CustomerEntry customer) {}

    public CustomerEntry saveCustomer(CustomerEntry customer) {
        CustomerEntry cObj=null;
        Session session =null;
        try {
            session = sessionFactory.getCurrentSession();
            if(customer != null){
                cObj= new CustomerEntry();
                cObj=(CustomerEntry)save(customer);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        return cObj;
    }

    public List<CustomerEntry> getCategoryList() {
        return null;
    }
}

另一件您无需担心事务管理的事情。既然你已经告诉弹簧:

<tx:annotation-driven/> <!--transaction-manager="transactionManager"--> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
                p:sessionFactory-ref="sessionFactory" /> 

您不需要手动启动AbstHibernateUtil.beginTransaction(); 并结束 AbstHibernateUtil.endTransaction();。您需要将您的课程CustomerDAOImpl 或方法saveCustomer 标记为@Transactional

另一个问题是:AbstHibernateUtil.closeSession();。当您在 spring 中定义 sessionFactory bean 时,您告诉他这样的事情:我不关心开幕式和闭幕式。 Spring 你现在需要这样做。所以现在这个:sessionFactory.getCurrentSession(); 正是你所需要的。仅此而已。

您应该将sessionFactory 移动到此类AbstractGenericDAOHibernate,因为不仅CustomerDAOImpl 使用工厂。

希望这能暂时解决您的一些问题。

【讨论】:

  • 更新为sessionFactory
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多