2013-04-04 3 views
1

My SessionFactory не вводится в переменную 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(); 
    } 
} 

Программа бросает NullPointerException, когда метод getSessionFactory() называется. Очевидно, sessionFactory не вводится. Программа запускается нормально. В чем может быть проблема?

+0

И вы уверены, что ваш класс Util находится в каталоге com.csu.library.mvc? – javadev

+0

Думаю, что да. Имя пакета класса Util: com.csu.library.mvc.hibernate –

+0

Как создается компонент класса Util в вашем проекте? –

ответ

2

впрыснуть как следующий, он будет работать нормально

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

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

Надежда, чтобы помочь вам :)

+0

Все еще бросает NullPointerException –

+1

, пожалуйста, внимательно ознакомьтесь с моим кодом, переменная SessionFactory не статична. то вы понимаете, как это сделать? –

+0

Я попытался внести изменения. Я удалил «статический» как из метода, так и из переменной, но sessionFactory все равно null. См. Обновленный класс HibernateUtil. –

0

В некоторых версиях весны подпапки не сканируются. Либо переместите свой класс в пакет com.csu.library.mvc, либо добавьте пакет com.csu.library.mvc.hibernate в отсканированные пакеты и попробуйте.

+0

Пробовал и провалился. –

+0

Не удалось добавить пакет и перемещаемый класс? – javadev

+0

Я добавил вышеупомянутый пакет к атрибуту base-package. Не работает. –

0

Вы хотите использовать org.springframework.beans.factory.annotation.Autowired аннотацию вместо javax.inject.Inject.

@Autowired 
private SessionFactory sessionFactory; 
+0

Я заменил Inject на Autowired. Все еще не работает. –

0

Обратите внимание, что только ищет аннотации на бобах в том же контексте приложений она определена. Это означает, что, если вы положили в в WebApplicationContext для DispatcherServlet, это только для проверки @Autowired бобов в вашей контроллеры, а не ваши услуги.

Смежные вопросы