即使在另一个控制器中实例化,Autowired属性也会给出null

时间:2014-05-18 15:16:50

标签: java spring hibernate spring-security

我定义了一个CustomUserDetailsS​​ervice,它使用自动装配的帐户从Hibernate数据库中提取用户名。在尝试访问重定向到Spring Security登录页面的http://localhost:8084/article之后,我尝试使用有效凭据登录。这是我得到的错误:

  

您的登录尝试失败,请重试。

     

原因:null

经过一些调试后,我意识到AccountDao实际上从未实例化过,而且它是空的。另一方面,这在我定义的Spring MVC的ArticleAccount中工作得很好(参见http://localhost:8084/article/add)。为什么会这样?

由于测试用例非常大,以下是URL: https://bitbucket.org/d33tah/javazaur/src/4e5451b

2 个答案:

答案 0 :(得分:2)

spring-security.xml和dispatcher-servlet.xml之间不共享您的配置。这意味着您声明< context:component-scan>在dispatcher-servlet.xml中没有应用于spring-security.xml中声明的bean,包括你的CustomUserDetailsService bean。

将以下内容添加到spring-security.xml应该使自动布线工作:

<context:annotation-config/>
<context:component-scan base-package="pl.javazaur" />

答案 1 :(得分:1)

这些是您的组件扫描标签。

<context:component-scan base-package="pl.javazaur.dao" />
<context:component-scan base-package="pl.javazaur.pojo" />
<context:component-scan base-package="pl.javazaur.controller" />

这是您的CustomUserDetailsS​​ervice包。

pl.javazaur.CustomUserDetailsService

所以CustomUserDetailsS​​ervice没有scaned包。
解决方案:使用此组件扫描

<context:component-scan base-package="pl.javazaur" />