1

我的 SessionFactory 没有被注入到 SessionFactory 变量中。我的配置如下:

<?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"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        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">

    <mvc:annotation-driven/>

    <tx:annotation-driven/>

    <context:annotation-config/>

    <!-- Scans the package for contents -->
    <context:component-scan base-package="com.csu.library.mvc"/>

    <!-- Maps static resources like images, css, javascript files -->
    <mvc:resources location="/resources/" mapping="/resources/**"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name = "viewClass" value = "org.springframework.web.servlet.view.JstlView"/>
        <property name = "prefix" value = "/WEB-INF/jsps/"/>
        <property name = "suffix" value = ".jsp"/>
    </bean>

    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/csu_library"/>
        <property name="username" value="csulibrary"/>
        <property name="password" value="csulibrary"/>

        <!-- Pool Properties -->
        <property name="initialSize" value="5" />
        <property name="maxIdle" value="5" />
        <property name="maxActive" value="10" />
    </bean>

    <bean id = "hibernateProperties" class = "java.util.Properties">
        <constructor-arg index="0">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
            </props>
        </constructor-arg>
    </bean>

    <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="packagesToScan" value = "com.csu.library.mvc"/>
        <property name="dataSource" ref = "dataSource"/>        
        <property name="hibernateProperties" ref = "hibernateProperties"/>

    </bean>

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

HibernateUtil.class

package com.csu.library.mvc.hibernate;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@org.springframework.context.annotation.Configuration
@EnableTransactionManagement
public class HibernateUtil {

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

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        return new HibernateTransactionManager(getSessionFactory());
    }

    @Bean
    public HibernateExceptionTranslator exceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}

调用 getSessionFactory() 方法时,程序会抛出NullPointerException 。显然, sessionFactory 没有被注入。程序启动良好。可能是什么问题呢?

4

4 回答 4

2

像下面这样注入,它会正常工作

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

public Session getSession() {
    return sessionFactory.getCurrentSession();
}

希望能帮到你:)

于 2013-04-04T11:50:19.477 回答
0

在某些 Spring 版本中,不扫描子文件夹。要么将你的类移到包 com.csu.library.mvc 中,要么在扫描的包中添加包 com.csu.library.mvc.hibernate 并试一试。

于 2013-04-04T11:18:49.663 回答
0

您将要使用org.springframework.beans.factory.annotation.Autowired注释而不是javax.inject.Inject.

@Autowired
private SessionFactory sessionFactory;
于 2013-04-04T12:00:07.523 回答
0

请注意,仅在定义它的同一应用程序上下文中查找 bean 上的注释。这意味着,如果您为 DispatcherServlet 放入 WebApplicationContext,它只会检查 控制器中的 @Autowired bean ,而不是您的服务。

于 2013-10-22T23:00:31.943 回答