2014-10-22 13 views
5

Das Abrufen der Nullzeiger-Ausnahme in der UesrDAO-Klasse als sessionFactory-Objekt ist immer null. Wenn dies hilft, habe ich herausgefunden, dass dieses Problem auftritt, wenn das DAO manuell mit "neu" erstellt wird, anstatt es von der Feder verarbeiten zu lassen. Ich mache das nicht, ich injiziere UserDAO in der Serviceklasse, bekomme aber trotzdem sessionFactory als null.Autowired sessionFactory-Objekt ist null

Jede Hilfe wird geschätzt, danke.

Unten finden Sie die Inhalte der relevanten Dateien:

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 Klasse:

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!"); 
    } 
} 

Service-Klasse :

@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

Sind beide Komponenten kommentierten mit '@ Component' (oder ähnliche Anmerkungen wie' @ Repository', '@ Service', etc)? Sind beide in 'org.questionbank' oder einem Unterpaket deklariert? –

+0

Können Sie den Stack-Trace veröffentlichen? –

+0

Gelöst, ich hatte keine UserDAO-Bean in XML, weder ich noch Annotation hinzugefügt, Hinzufügen der Annotation hat den Trick. Danke @AnthonyAccioly für den Hinweis darauf. – usercpd

Antwort

2

Ihre aktuelle Konfiguration, mit <context:annotation-config /> und <context:component-scan base-package="org.questionbank"/> ermöglicht die erste Hälfte der funktionell, dass Sie benötigen, um richtig zu machen Frühling erkennen und Ihre Bohne zu injizieren.

Die andere Hälfte deklariert die Bean tatsächlich als Spring-verwaltete Komponente.

Sie können dies auf zwei Arten tun. Entweder erklären die Bohne in applicationContext.xml mit einem <bean />-Tag (wie Sie mit Ihrem transactionManager tat) oder verwenden Sie eine stereotype annotation (wie @Component, @Repository, @Service oder @Controller).

@Repository 
public class UserDAO { // ... 

Und

@Service 
public class CustomUserDetailsService { // ... 
Verwandte Themen