如何在 CDI bean 中调用 Service Class 接口

How to invoke Service Class Interface in CDI bean

我们计划将托管 Bean 更改为 CDI Bean。我们使用以下代码在托管 Bean 中调用服务 class。

@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 integration: how to inject a Spring component/service in JSF managed bean? 上的回答告诉我应该支持将您的 Spring bean userService 注入到您的 CDI bean LoginController 中。

但是您的 UserServiceImpl 不是 Serializable,这在 CDI 上下文中意味着它不具有 钝化能力

这也是您的异常告诉的内容。

所以要么让你的 LoginController @RequestScoped 而不是 @SessionScoped 所以它本身和 @Injected children 不需要钝化能力(又名 Serializable ). 或者让你的 UserServiceImpl 和 DAO 实现 Serializable(哪个恕我直言有点奇怪?)。