2014-10-22 3 views
5

Получение исключения null указателя в классе UesrDAO в качестве объекта sessionFactory всегда равно null. Если это поможет, я узнал, что это происходит, если DAO создается вручную с помощью «нового» вместо того, чтобы позволить весне справиться с этим. Я этого не делаю, я вводил UserDAO в класс обслуживания, но все равно получаю sessionFactory как null.Autowired sessionFactory object is null

Любая помощь приветствуется, спасибо.

Ниже приводится содержание соответствующих файлов:

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"> 
      <value>/WEB-INF/properties/database.properties</value> 
     </property> 
    </bean> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource"> 
      <ref bean="dataSource"/> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
     <property name="packagesToScan"> 
      <list> 
       <value>org.questionbank.dto</value> 
      </list> 
     </property> 
    </bean> 
</beans> 

applicationContext.xml класс

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-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.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

    <import resource="hibernate.cfg.xml"/> 
    <mvc:annotation-driven /> 
    <tx:annotation-driven /> 
    <context:annotation-config /> 
    <!-- To scan the components --> 
    <context:component-scan base-package="org.questionbank"/> 
    <bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name = "sessionFactory" ref = "sessionFactory" /> 
    </bean> 
</beans>  

DAO: класс

public class UserDAO 
{ 
    protected static Logger logger = Logger.getLogger("dao"); 

    @Autowired 
    private SessionFactory sessionFactory; 

    public UserDTO searchDatabase(String username) 
    { 
     logger.debug("Seraching for user in DB"); 
     UserDTO user=new UserDTO(); 
     Query query = sessionFactory.getCurrentSession().createQuery("FROM UserDTO u WHERE u.userName = :userName"); 
     query.setParameter("userName", username); 
     user = (UserDTO) query.uniqueResult(); 
     if(user!=null) 
      return user; 
     logger.error("User does not exist!"); 
     throw new RuntimeException("User does not exist!"); 
    } 
} 

Услуги :

@Transactional(readOnly = true) 
public class CustomUserDetailsService implements UserDetailsService 
{ 
    protected static Logger logger = Logger.getLogger("service"); 
    @Autowired 
    private UserDAO userDAO; 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException 
    { 
     UserDetails user = null; 
     try 
     { 
      UserDTO dbUser = userDAO.searchDatabase(username); 
      user = new User(
        dbUser.getUserName(), 
        dbUser.getPassword().toLowerCase(), 
        true, 
        true, 
        true, 
        true, 
        getAuthorities(Integer.parseInt(dbUser.getAccess()))); 
      } catch (Exception e) { 
      logger.error("Error in retrieving user"); 
      e.printStackTrace(); 
      throw new UsernameNotFoundException("Error in retrieving user"); 
     } 
     return user; 
    } 
+2

ли оба компонента с аннотацией '@ Component' (или аналогичные аннотации, такие как' @ Repository', '@' обслуживания, и т.д.)? Кроме того, оба они объявлены в 'org.questionbank' или подпакет? –

+0

Можете ли вы опубликовать трассировку стека? –

+0

Решенный, у меня не было компонента UserDAO в xml, и я не добавил для него аннотацию, добавив, что аннотация сделала трюк. Спасибо, @AnthonyAccioly за это. – usercpd

ответ

2

текущей конфигурации, с <context:annotation-config /> и <context:component-scan base-package="org.questionbank"/> позволяет первой половине функционально, что вам нужно для того, чтобы сделать Spring правильно распознать и ввести свой боб.

Другая половина фактически объявляет bean как компонент, управляемый Spring.

Вы можете сделать это одним из двух способов. Либо объявить боб в applicationContext.xml с <bean /> тегом (так же, как вы сделали с вашей transactionManager) или использовать stereotype annotation (например, @Component, @Repository, @Service или @Controller).

@Repository 
public class UserDAO { // ... 

И

@Service 
public class CustomUserDetailsService { // ... 

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

  • Нет связанных вопросов^_^