我的控制器包含以下注释:
@Resource(name="userService")
private UserDetailsServiceImpl userService;
并且服务本身具有以下内容:
@Service("userService")
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
但是我在启动时收到以下错误:
注入资源依赖项 失败;嵌套异常是 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean命名为'userDetailsServiceImpl' 必须是类型 [myapp.service.UserDetailsServiceImpl],但实际上是 输入[$ Proxy19]
答案 0 :(得分:8)
应该是
@Resource(name="userService")
private UserDetailsService userService;
Spring使用接口类型来进行依赖注入,而不是实现类型
答案 1 :(得分:3)
更改为(界面而非具体类):
@Resource(name="userService")
private UserDetailsService userService;
从此幸福地生活。
长版本:在运行时,默认情况下,Spring会使用实现类的所有接口的 something 替换您的类。如果您注入接口而不是具体类型,则不关心实现此接口的确切类型。
在您的情况下,添加@Transactional
注释会导致您的bean被具有事务功能的AOP代理替换。如果删除此注释,您的代码将运行正常。但是,依赖接口是一个好主意,而不是具体实现。