简体   繁体   中英

Error after .getCurrentSession() with Hibernate Spring

When getting Session with .getCurrentSession() getting the following error.

Error :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'miniVLEController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: miniVLE.service.StudentService miniVLE.controller.miniVLEController.studentService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: miniVLE.dao.MiniVLEDAOImplementation miniVLE.service.StudentService.dao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'miniVLEDAOImplementation' defined in file [C:\\Users\\1\\Documents\\NetBeansProjects\\com3014_mini_VLE\\build\\web\\WEB-INF\\classes\\miniVLE\\dao\\MiniVLEDAOImplementation.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [miniVLE.dao.MiniVLEDAOImplementation]: Constructor threw exception; nested exception is java.lang.NullPointerException

DAO Implementation:

import java.util.ArrayList;
import java.util.List;
import miniVLE.beans.Course;
import miniVLE.beans.Department;
import miniVLE.beans.Module;
import miniVLE.beans.Student;
import miniVLE.beans.TimeSlot;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MiniVLEDAOImplementation implements MiniVLEDAO{

    // Used for communicating with the database
    @Autowired
    private SessionFactory sessionFactory;

    /**
     * DAO constructor filled with dummy data 
     */
    public MiniVLEDAOImplementation() {
        System.out.println("*** MiniVLEDAOImplementation instantiated");
        Student s1 = new Student("123456","Bob","123");
        Department d1 = new Department("COM","Computing");
        Course c1 = new Course("COM3014","Web");
        c1.setDepartment(d1);
        s1.setCourse(c1);
        s1.setDept(d1);

        // Add new student to the database
        addStudentToDB(s1);

    }

    /**
     * Gets the current session and adds new student row into the database
     * @param student 
     */
    @Override
    public void addStudentToDB(Student student) {         
        sessionFactory.getCurrentSession();  // here i got rid of full implementation as it fails on getting the current session
    } ... 

Dispatcher-Servlet:

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

    <context:annotation-config />
    <context:component-scan base-package="miniVLE.controller" />
    <context:component-scan base-package="miniVLE.service" />
    <context:component-scan base-package="miniVLE.beans" />
    <context:component-scan base-package="miniVLE.dao" />

    <!-- Declare a view resolver-->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />


    <!-- Connects to the database based on the jdbc properties information-->
    <bean id="dataSource" class ="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name ="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name ="url" value="jdbc:derby://localhost:1527/minivledb"/>
        <property name ="username" value="root"/>
        <property name ="password" value="123" />
    </bean>

     <!-- Declares hibernate object -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> ${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            </props>
        </property>
        <!-- A list of all the annotated bean files, which are mapped with database tables-->
        <property name="annotatedClasses">
            <list>
                <value> miniVLE.beans.Course </value>
                <value> miniVLE.beans.Student </value>
                <value> miniVLE.beans.Department </value>  
                <value> miniVLE.beans.Module </value>  
                <value> miniVLE.beans.TimeSlot </value> 
            </list>
        </property>
    </bean>

</beans>

To create your beans, Spring first uses your class' no-argument constructor to create an instance and then uses reflection to autowire @Autowired fields.

But your constructor

public MiniVLEDAOImplementation() {
    ...
    // Add new student to the database
    addStudentToDB(s1);
}

calls a method that uses the SessionFactory before it has been initialized. It is therefore null and you get a NullPointerException when trying to call a method on it.

You cannot add the student to the database from that point. If you want to test out your class, try unit testing.

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