【问题标题】:Spring + Hibernate DAO injection fails in NetbeansNetbeans 中的 Spring + Hibernate DAO 注入失败
【发布时间】:2015-03-28 20:06:36
【问题描述】:

我有控制器类 LoginData.java

@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;

}

登录DAOImpl

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:

调度程序-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 方法时,我得到空指针异常。任何人都知道可能是什么问题? PS:xml文件大多由Netbeans IDE生成。

【问题讨论】:

  • 这里是重复/冗余注释@Controller@ManagedBean(name = "login")@SessionScoped。在 Spring 之上使用 JSF 时,org.springframework.web.servlet.DispatcherServlet 是不必要的。它适用于不能与 JSF 一起使用的 Spring MVC。 dispatcher-servlet.xml 在这种情况下也没有用,根本不需要(在 Spring 之上使用 JSF - 而不是 Spring MVC)。
  • 我需要这些,没有这些我的项目将无法运行。
  • 不。由于 bean 由 Spring 管理,这两个注释 @ManagedBean(name = "login")@SessionScoped 将被忽略,就好像它们不再存在一样,并且该类只有一个注释 @Controller,Spring beans 的默认范围为 singleton。它不是 JSF 会话范围的托管 bean,而是 Spring 单例 bean。您需要 @Controller@Scope("session")(来自 org.springframework.context.annotation)。 org.springframework.web.servlet.DispatcherServletdispatcher-servlet.xml 是必需的,当您使用 Spring MVC 时,这里不是这种情况
  • 你有xml文件的样本吗?

标签: spring hibernate jsf netbeans


【解决方案1】:

您缺少 @Repository 注释以使自动装配正常工作。

试试这个:

@Repository("LoginDAO")
public class LoginDAOImpl implements LoginDAO

【讨论】:

  • 不,我仍然得到 NullPointerException。
  • 傻瓜,你需要检查你的applicationContext.xml 是否有&lt;context:component-scan base-package="your.package"/&gt;&lt;context:annotation-config/&gt;
  • 你能给出代码示例吗?而且这个包应该指向Dao的接口和实现?
  • 当我添加扫描包时,我不得不删除 Repository 注释,因为它检测到 dao 为 double。
  • 之所以重复是因为您在 dispatcher-servlet.xml 文件中定义了 loginDAO。你应该删除它。
猜你喜欢
  • 2012-10-17
  • 2013-05-01
  • 2017-05-04
  • 1970-01-01
  • 2021-06-29
  • 2011-01-27
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多