Jakarta ee JavaEECDI作用域、EJB和托管bean序列化

Jakarta ee JavaEECDI作用域、EJB和托管bean序列化,jakarta-ee,serialization,jboss,dependency-injection,cdi,Jakarta Ee,Serialization,Jboss,Dependency Injection,Cdi,对作用域、EJB和托管bean有一些问题 作用域(javax.enterprise.context.ApplicationScope、javax.enterprise.context.SessionScope)是否仅用于EJB?或者它们适用于所有托管bean?直到今天,我还很确定这是为所有的管理豆 在我的申请中,我们有: @ApplicationScoped public class MyClass implements MyNonSerializableInterface { @Injec

对作用域、EJB和托管bean有一些问题

  • 作用域(javax.enterprise.context.ApplicationScope、javax.enterprise.context.SessionScope)是否仅用于EJB?或者它们适用于所有托管bean?直到今天,我还很确定这是为所有的管理豆
  • 在我的申请中,我们有:

    @ApplicationScoped
    public class MyClass implements MyNonSerializableInterface {
      @Inject  
      private transient NonSerializableLogger transientLogger;
      @Inject
      private NonSerializableLogger logger;
     ...
    }
    
    还有一些经理:

    @Singleton
    public class SomeManager {
        @Inject private MyClass myClass;  
    
    }
    
    和web服务:

    @Path("some")
    public class SomeWebService {
        @Inject private SomeManager;
    
    }
    
  • 容器(部署时)或编译器不会对此抱怨,这正常吗

    我想:

    使用会话、应用程序或会话作用域的bean必须是可序列化的,但使用请求作用域的bean不必是可序列化的

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

  • 如果是:如果我使MyClass@ApplicationScoped和@Stateful并使用@EJB将其注入SomeManager,那么在部署时我确实会收到一个关于序列化的错误
  • 如果否:为什么不为瞬态记录器获取一些NullPointerException(由于PASIVATION/激活)

  • CDI作用域在CDI容器的上下文中进行评估。这就是说,CDI规范的设计者确保它可以与EJB和jsf管理的Bean一起操作。也就是说

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

  • @SessionScope使用当前容器希望的会话语义。例如,在jsf应用程序中,它的作用域通常是HttpSession的生存期,但在没有HttpSession的EJB容器中,容器不会附加任何有意义的会话语义。它可能决定是每@无状态事务或它希望的任何事务。由于会话可以序列化,规范通常要求@SessionScoped bean是可序列化的,但是定义注入点的bean(如果不是@SessionScoped)不需要是可序列化的

  • @RequestScope还遵循“原子”操作的单一执行语义,例如httprequest。在web容器中,它通常与HttpRequest关联,并且不要求它是可序列化的。在非web上下文中,它可能与每次调用关联,甚至与事务边界(在注入EJB的情况下)关联,或者在注入点处它将默认为@Dependent scope,而此时没有有意义的作用域可归属


  • 也就是说,任何CDIBean都可以注入到任何EJB bean中。通常,在与web容器没有关联的EJB容器中,@Dependent和@ApplicationScope是唯一有意义用法的作用域。

    谢谢,先生。编辑了我的问题。因为只有第一个答案回答了我的一个问题,而且你似乎说链接(Java EE教程)是错误的?“作用域(ApplicationScope,SessionScope…)是否仅适用于EJB?”所以实际上:“CDI托管bean是上下文的,EJB bean不是”Adam Bien: