在我的项目中,我需要一个自定义的userDetailsService,所以我在某个包中声明它:
@Service
@Ihm(name = "userDetailsService")// ignore Ihm, it's just a custom annotation, which works fine
public class UserDetailsServiceImpl implements UserDetailsService
在我的application-security.xml文件中,我添加了component-scan,
<context:component-scan base-package="path(including the userDetailsService for sure)" />
<context:annotation-config />
没有帮助我找到我的注释bean,我没有定义bean的例外。
我的唯一方法是: 1.删除服务注释 2.使用beans:bean,id,class在application-security.xml中创建bean。 这很好。
更有趣的是,当我保留组件扫描和注释时,我得到了一个ID重复的ID(多个bean,要求指定ID)错误。
More than one UserDetailsService registered. Please use a specific Id reference in <remember-me/> <openid-login/> or <x509 /> elements.
所以这意味着@Service
确实创建了bean,但是你不知道security.xml找到了它吗?
答案 0 :(得分:2)
Spring Security是针对UserDetailsService
userDetailsService
的bean名称自动布线bean。
@Service
public class UserDetailsServiceImpl implements UserDetailsService
上面的代码(就像你的代码一样)会导致类型为UserDetailsService
的bean,但是名称为userDetailsServiceImpl
而不是userDetailsService
,因此Spring安全套件永远不会使用你的bean也没有被它发现。 (有关命名约定的信息,请参阅Spring Reference Guide
要解决此问题,请将弹簧安全配置和put in a reference更改为userDetailsServiceImpl
bean
<authentication-manager>
<authentication-provider user-service-ref='userDetailsServiceImpl'/>
</authentication-manager>
或通过在@Service
注释中提供名称来更改bean的名称。
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService
无论哪种方式都可行。
<强>链接强>