我们计划将托管 Bean 更改为 CDI bean。我们使用以下代码在托管 Bean 中调用 Service 类。
@ManagedProperty("#{userService}")
private UserService userService; and setter method
对于 CDI bean,我用如下所示的 @inject 替换了@ManagedProperty,它抛出以下异常。
@SessionScoped
@Named
public class LoginController implements Serializable {
@Inject
private UserService userService;
}
org.apache.webbeans.exception.WebBeansDeploymentException: Passivation capable beans must satisfy passivation capable dependencies.
UserService是一个具有未实现方法的普通接口,UserServiceImpl实现了UserService接口。请看下面:
public interface UserService {
public List<User> getUserList();
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
public List<User> getUserList() {
return userDao.getUserList();
}
}
请告诉我如何在 CDI bean 中调用服务接口?
阅读BalusC关于Spring JSF集成的答案:如何在JSF管理的Bean中注入Spring组件/服务? 告诉我应该支持将 Spring beanuserService
注入您的 CDI beanLoginController
。但是您的UserServiceImpl
不是Serializable
这在CDI上下文中意味着它不具有钝化能力。
这也是您的异常所说明的。
因此,要么使您的登录控制器@RequestScoped
而不是@SessionScoped
,这样它本身和@Inject
ed 子项都不需要具有钝化能力(又名Serializable
(。 或者让你的UserServiceImpl
和DAO实现Serializable
(恕我直言,这有点奇怪?