Jakarta ee 从视图范围的托管Bean访问已创建的EJB

Jakarta ee 从视图范围的托管Bean访问已创建的EJB,jakarta-ee,ejb,jsf-2.2,Jakarta Ee,Ejb,Jsf 2.2,在我的web项目中,我有以下组件: EJBannotated类UserService EJBannotated类UserDAOImpl SessionScopedmanagedbean调用UserStateBean ViewScopedManagedBean调用AdminDashboardView EJBUserService是在UserStateBean的init方法(用PostConstruct注释)中创建的,而UserDAOImpl也是在UserService的init方法中创建的 问题:

在我的web项目中,我有以下组件:

  • EJB
    annotated类
    UserService
  • EJB
    annotated类
    UserDAOImpl
  • SessionScoped
    managedbean
    调用
    UserStateBean
  • ViewScoped
    ManagedBean
    调用
    AdminDashboardView
  • EJB
    UserService
    是在
    UserStateBean
    init
    方法(用
    PostConstruct
    注释)中创建的,而
    UserDAOImpl
    也是在
    UserService
    init
    方法中创建的

    问题:

  • 这些
    EJB
    类是无状态的吗?(除了
    @EJB
    )如果没有,应该在上面使用注释吗
  • AdminDashboardView
    中,我需要访问
    UserService
    EJB
    。这样做的正确方式是什么
    我已经尝试过的内容(2):
    AdminDashboardView
    中,我将其声明为成员,如下所示:

    @EJB
    private UserService userService;
    
    init
    函数中,我有以下内容:
    userService=newuserservice()
    这很好,并且成功地完成了我想做的事情,但是,这是正确的方法吗?

    我的想法是,它可能是正确的,因为我得到的
    UserService
    EJB
    new
    实例来自容器拥有的池()。这是正确的吗?

    绝对不是

    您不应该像创建JSF/CDI托管bean那样自己创建EJB。您现在看到的是一个完全不受EJB容器控制的手动创建和管理的实例。如果EJB类依次包含一个
    @PersistenceContext
    ,或另一个
    @EJB
    ,那么它将保持
    null
    ,等等。而且手动创建的实例完全没有代理和事务管理的概念。
    new
    的工作方式与
    main()
    方法中的工作方式完全相同

    @Stateless
    放在EJB类上,并在
    @PostConstruct
    中放弃手动创建。
    @EJB
    基本上已经注入了它(就像
    @Inject
    基本上已经注入了任何
    @Named
    )。
    @EJB
    支持注入
    @Stateless
    @Stateful
    @Singleton

    另见:
      • 绝对不是

        您不应该像创建JSF/CDI托管bean那样自己创建EJB。您现在看到的是一个完全不受EJB容器控制的手动创建和管理的实例。如果EJB类依次包含一个
        @PersistenceContext
        ,或另一个
        @EJB
        ,那么它将保持
        null
        ,等等。而且手动创建的实例完全没有代理和事务管理的概念。
        new
        的工作方式与
        main()
        方法中的工作方式完全相同

        @Stateless
        放在EJB类上,并在
        @PostConstruct
        中放弃手动创建。
        @EJB
        基本上已经注入了它(就像
        @Inject
        基本上已经注入了任何
        @Named
        )。
        @EJB
        支持注入
        @Stateless
        @Stateful
        @Singleton

        另见:
          • 绝对不是

            您不应该像创建JSF/CDI托管bean那样自己创建EJB。您现在看到的是一个完全不受EJB容器控制的手动创建和管理的实例。如果EJB类依次包含一个
            @PersistenceContext
            ,或另一个
            @EJB
            ,那么它将保持
            null
            ,等等。而且手动创建的实例完全没有代理和事务管理的概念。
            new
            的工作方式与
            main()
            方法中的工作方式完全相同

            @Stateless
            放在EJB类上,并在
            @PostConstruct
            中放弃手动创建。
            @EJB
            基本上已经注入了它(就像
            @Inject
            基本上已经注入了任何
            @Named
            )。
            @EJB
            支持注入
            @Stateless
            @Stateful
            @Singleton

            另见:
              • 绝对不是

                您不应该像创建JSF/CDI托管bean那样自己创建EJB。您现在看到的是一个完全不受EJB容器控制的手动创建和管理的实例。如果EJB类依次包含一个
                @PersistenceContext
                ,或另一个
                @EJB
                ,那么它将保持
                null
                ,等等。而且手动创建的实例完全没有代理和事务管理的概念。
                new
                的工作方式与
                main()
                方法中的工作方式完全相同

                @Stateless
                放在EJB类上,并在
                @PostConstruct
                中放弃手动创建。
                @EJB
                基本上已经注入了它(就像
                @Inject
                基本上已经注入了任何
                @Named
                )。
                @EJB
                支持注入
                @Stateless
                @Stateful
                @Singleton

                另见:

                谢谢您的回复,但我仍在努力初始化
                用户服务
                EJB
                。1) 首先,它应该声明为无状态,因为它只包含一个
                UserDAO
                EJB