简体   繁体   中英

Null pointer error while using sessionfactory on Hibernate 4 with Spring 3.2

I'm struggling to figure out the exact problem, why the Null Pointer Error is thrown for Hibernate sessionFactory when I try to Auto wire sessionFactory from spring bean xml. Could somebody please help me out fix this. I'm new to Spring and deploying the app on Jboss server

Here is the Spring-Config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <context:annotation-config />
    <context:component-scan base-package="org.kp.db.dao.impl" />


    <bean id="myDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/ebm" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="configLocation" value="classpath:/hibernate.cfg.xml" />
    </bean>

    <tx:annotation-driven  transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
</beans>

Here is Hiberante.cfg.xml which I placed in webcontent folder

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ebm</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="org/kp/db/model/Actioncode.hbm.xml"/>
    <mapping class="org.kp.db.model.TblEBMFieldDetails"/>
    <mapping class="org.kp.db.model.TbleOLI"/>
  </session-factory>
</hibernate-configuration>

And the DAO class in which I'm trying to access the sessionFactory is

package org.kp.db.dao.impl;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.kp.db.dao.ActionCodeDao;
import org.kp.db.model.Actioncode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Administrator
 */
@Repository
public class ActionCodeDaoImpl implements ActionCodeDao{

    @Override
    public String[] getActionCodes() {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Autowired(required=true)
    SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }


    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @Transactional(readOnly=true,propagation=Propagation.REQUIRED)
    public String getActionCode(int id) {

        //ApplicationContext context;

        Session  session = sessionFactory.getCurrentSession();
        Actioncode actionCode=null;
        actionCode = (Actioncode)session.get(Actioncode.class, 1);

        return actionCode.getActionName();
    }

}

I've fixed the issue, instead of accessing the object I used the getter method and it worked, not sure what is the real concept behind it.

public String getActionCode(int id) {

    //ApplicationContext context;

    Session  session = getSessionFactory().getCurrentSession();
    Actioncode actionCode=null;
    actionCode = (Actioncode)session.get(Actioncode.class, 1);

    return actionCode.getActionName();
}
@Named ("kpAction") 
public class Actions { 
    public String getActionCode() { 
        ActionCodeDao action =new ActionCodeDaoImpl(); 
        String str = action.getActionCode(1); System.out.println(str); return str; 
    } 
} 

When you run this line of code: ActionCodeDao action =new ActionCodeDaoImpl(); you get an object that is not managed by Spring and therefore will not contain the autowired dependencies.

I would say that is why you saw the null pointer.

However you say you have fixed it now, not sure if you inadvertantly changed this as well, if not im not sure how youve fixed it :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM