如何在 CDI Bean 中调用服务类接口



我们计划将托管 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,这样它本身和@Injected 子项都不需要具有钝化能力(又名Serializable(。 或者让你的UserServiceImpl和DAO实现Serializable(恕我直言,这有点奇怪?

最新更新