Spring+Hibernate DAO注入在Netbeans中失败
我有控制器类loginda.javaSpring+Hibernate DAO注入在Netbeans中失败,spring,hibernate,jsf,netbeans,Spring,Hibernate,Jsf,Netbeans,我有控制器类loginda.java @Controller @ManagedBean(name = "login") @SessionScoped public class LoginData implements Serializable{ @Autowired private LoginDAO loginDao; private String username; private String password; public String getUsername() { re
@Controller
@ManagedBean(name = "login")
@SessionScoped
public class LoginData implements Serializable{
@Autowired
private LoginDAO loginDao;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void validateUser(){
try{
loginDao.login(username, password);
}catch(BusinessException e){
}
}
}
我正在尝试自动连接此Dao及其实现:
洛金多
public interface LoginDAO {
public boolean login(String username, String password)throws BusinessException;
public boolean register(String username, String password, UserType type)throws BusinessException;
}
洛根多伊姆普酒店
public class LoginDAOImpl implements LoginDAO{
private String username;
private String password;
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public boolean login(String username, String password) throws BusinessException{
Query query = sessionFactory.getCurrentSession().createQuery(
"SELECT u FROM User u WHERE u.username=:un");
query.setParameter("un", username);
if(query.list().size()==0)throw new BusinessException("No user in database!");
User user = (User)(query.list().get(0));
return getHashMD5(password).equals(user.getPassword());
}
@Override
public boolean register(String username, String password, UserType type) throws BusinessException{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public static String getHashMD5(String string) throws BusinessException{
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
return bi.toString(16);
} catch (Exception ex) {
throw new BusinessException(ex.getMessage());
}
}
}
我还试图在DAO实现中注入sessionFactory,我不知道这段代码是否有效。用于配置的我的xml:
dispatcher-servlet.xml
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<!--
The index controller.
-->
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
<bean id="loginDAO" class="rs.ac.bg.etf.services.LoginDAOImpl"/>
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
当从JSF表单在控制器中调用dao方法时,我得到空指针异常。有人知道问题出在哪里吗?
注:xml文件主要由Netbeans IDE生成。您缺少@Repository注释,无法自动连接
试试这个:
@Repository("LoginDAO")
public class LoginDAOImpl implements LoginDAO
不,我仍然得到NullPointerException。愚蠢的我,你需要检查你的applicationContext.xml,你能给出代码示例吗?这个包应该指向Dao接口和实现?当我添加扫描包时,我不得不删除存储库注释,因为它检测到Dao是双重的。重复这个包的原因是因为您在dispatcher-servlet.xml文件中定义了loginDAO。您应该删除该注释。以下是重复/冗余注释@Controller、@ManagedBeanname=login、@SessionScoped。在Spring之上使用JSF时,不需要org.springframework.web.servlet.DispatcherServlet。它是针对不能与JSF一起使用的SpringMVC的。dispatcher-servlet.xml在Spring之上使用JSF时也是无用的,在这种情况下根本不需要,而不是Spring MVC。由于bean由Spring管理,这两个注释@ManagedBeanname=login、@SessionScoped将被忽略,就好像它们不再存在一样,并且该类只有一个注释,即@Controller,其默认作用域为Springbeans的singleton。它不是一个JSF会话范围的托管bean,而是一个Spring单例bean。您需要org.springframework.context.annotation中的@Controller和@Scopesession。当您使用Spring MVC时,org.springframework.web.servlet.DispatcherServlet和dispatcher-servlet.xml是必需的,但情况并非如此。您有xml文件的示例吗?