【问题标题】:JAVA EE CDI Scopes, EJBs and managed beans serializationJAVA EE CDI 范围、EJB 和托管 bean 序列化
【发布时间】:2014-09-18 09:26:09
【问题描述】:

对范围、ejb 和托管 bean 有一些疑问。

  1. 范围(javax.enterprise.context.ApplicationScope、javax.enterprise.context.SessionScope)是否仅适用于 EJB?还是它们适用于所有托管 bean?直到今天,我都非常确定它适用于所有托管 bean。
  2. 在我的应用程序中,我们有:

    @ApplicationScoped
    public class MyClass implements MyNonSerializableInterface {
      @Inject  
      private transient NonSerializableLogger transientLogger;
      @Inject
      private NonSerializableLogger logger;
     ...
    }
    

    还有一些经理:

    @Singleton
    public class SomeManager {
        @Inject private MyClass myClass;  
    
    }
    

    和一个网络服务:

    @Path("some")
    public class SomeWebService {
        @Inject private SomeManager;
    
    }
    

容器(部署时间)或者编译器没有报错,正常吗?

我认为:

“使用会话、应用程序或会话范围的 bean 必须是可序列化的,但使用请求范围的 bean 不必是可序列化的。”JAVA EE Using Scopes

MyClass 是否应该实现 Serializable?我们是否可以说因为托管 bean 被注入到 @Singleton 中,所以永远不会发生序列化?因此在部署时没有显示序列化错误?

  1. 如果是:如果我创建 MyClass @ApplicationScoped 和 @Stateful 并使用 @EJB 将其注入 SomeManager,那么在部署时我会收到关于序列化的错误..
  2. 如果否:为什么我没有为瞬态 Logger 获得一些 NullPointerExceptions(由于钝化/激活)?

【问题讨论】:

  • “范围(ApplicationScope、SessionScope..)是否仅适用于 EJB?”所以实际上:“CDI 管理的 bean 是上下文的,而 EJB bean 不是”Adam Bien 在:oracle.com/technetwork/articles/java/…

标签: jakarta-ee serialization jboss dependency-injection cdi


【解决方案1】:

CDI 范围在 CDI 容器的上下文中进行评估。也就是说,CDI 规范的设计者确保它可以与 EJB 和 jsf Managed Bean 一起使用。就是这么说的。

  1. 理想情况下,CDI 范围对使用上下文敏感。 @ApplicationScoped 意味着 CDI bean 应该从它创建的实例到应用程序结束。它由 CDI 容器管理,与 EJB bean 完全无关。但是由于与 EJB 的互操作性,它可以被注入 (@Inject) 到 EJB @Singleton bean 中。 EJB 规范和 CDI 规范都没有要求 @Singleton bean 或 @ApplicationScope bean 是可序列化的。由于这是一个应用程序范围的实例,它不需要钝化。

  2. @SessionScope 使用当前容器希望的会话语义。例如,在 jsf 应用程序中,它通常会限定为 HttpSession 的生命周期,但在没有 HttpSession 的 EJB 容器中,容器不会附加任何有意义的会话语义。它可能决定成为每个@Stateless 事务或它希望的任何事务。由于会话可以序列化,规范通常要求@SessionScoped bean 可序列化,但定义注入点的bean,如果不是@SessionScoped,则不需要可序列化。

  3. @RequestScope 也遵循单次执行“原子”动作的语义,例如http请求。在 web 容器中,一般会与 HttpRequest 相关联,并不要求它是可序列化的。在非 Web 上下文中,它可能与每个调用相关联,甚至与事务边界(在注入 EJB 的情况下)相关联,或者在注入点默认为 @Dependent 范围,当没有有意义的范围可以归属时。

也就是说,任何 CDI bean 都可以注入任何 EJB bean。通常在不与 Web 容器关联的 EJB 容器中,@Dependent 和 @ApplicationScope 是唯一具有任何有意义用途的作用域。

【讨论】:

  • 谢谢先生。编辑了我的问题。因为只有第一个答案回答了我的一个问题,而且您似乎说链接(Java EE 教程)有误?
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2012-06-22
  • 2014-04-30
  • 2012-06-30
  • 1970-01-01
  • 2013-06-30
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多