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;
}
Sind beide Komponenten kommentierten mit '@ Component' (oder ähnliche Anmerkungen wie' @ Repository', '@ Service', etc)? Sind beide in 'org.questionbank' oder einem Unterpaket deklariert? –
Können Sie den Stack-Trace veröffentlichen? –
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