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

时间:2019-10-16 19:04:40

标签: spring jsf cdi

我们计划将托管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中调用服务接口?

1 个答案:

答案 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(哪个恕我直言有些奇怪?)。