【问题标题】:How to invoke Service Class Interface in CDI bean如何在 CDI bean 中调用服务类接口
【发布时间】:2020-02-13 15:15:59
【问题描述】:

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

【问题讨论】:

  • UserService 是带有 @Named 注释的 CDI-Bean 吗?而且您没有使用跟踪添加完整的异常。
  • @selaron : UserService 是一个带有未实现方法的普通接口,而 UserServiceImpl 实现了 UserService 接口。
  • 编辑帖子以包含详细信息是完全正确的。这仍然不是完整的异常堆栈跟踪,但比以前更好。
  • 谁在管理 userService bean?如果它应该是 CDI bean,则 UserServiceImpl 应该被注释为 @Named(和适当的范围)。和/或它必须是可序列化的,因为您的 LoginController 是 SessionScopend,因此需要是可序列化的,而且所有字段都需要是可序列化的。
  • 看起来这是一个 SpringFramework bean

标签: spring jsf cdi


【解决方案1】:

阅读 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 孩子不需要具有钝化能力(又名 Serializable)。 或者让你的UserServiceImpl 和DAO 实现Serializable(恕我直言有点奇怪?)。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 2015-04-20
    • 2013-01-18
    • 2016-06-08
    • 1970-01-01
    • 2013-02-26
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多