我们计划将托管Bean更改为CDI Bean。我们使用以下代码在托管Bean中调用Service类。
@ManagedProperty("#{userService}")
private UserService userService; and setter method
对于CDI bean,我将@ManagedProperty替换为@inject,如下所示,并且它引发以下异常。
@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中调用服务接口?
答案 0 :(得分:1)
阅读Spring JSF integration: how to inject a Spring component/service in JSF managed bean?上BalusC的回答可以告诉我应该支持将Spring bean userService
注入到CDI bean LoginController
中。
但是您的UserServiceImpl
不是Serializable
,这在CDI上下文中意味着它没有钝化能力。
这也是您的异常所告知的。
因此,使您的LoginController @RequestScoped
而不是@SessionScoped
成为可能,这样本身和@Inject
的孩子就不需要具有钝化能力(也就是Serializable
)。
或将您的UserServiceImpl
和DAO实现实现为Serializable
(哪个恕我直言有些奇怪?)。