Jakarta ee 将相同的有状态ejb实例注入不同的managedbeans

Jakarta ee 将相同的有状态ejb实例注入不同的managedbeans,jakarta-ee,ejb,managed-bean,Jakarta Ee,Ejb,Managed Bean,我试图在JSF上建立一个简单的博客。然而,我不知道如何将相同的有状态ejb实例注入到两个不同的托管bean中。我知道注入可以通过@ManagedProperty注释间接完成。诸如此类: @ManagedBean @ViewScoped public class PostController implements Serializable { private static final long serialVersionUID = 1L; private Post temporaryPost;

我试图在JSF上建立一个简单的博客。然而,我不知道如何将相同的有状态ejb实例注入到两个不同的托管bean中。我知道注入可以通过@ManagedProperty注释间接完成。诸如此类:

@ManagedBean
@ViewScoped
public class PostController implements Serializable {

private static final long serialVersionUID = 1L;

private Post temporaryPost;

@ManagedProperty(value = "#{authenticationController}")
private AuthenticationController authenticationController;

@Inject
private PostEJB postEJB;

public void save() {
    getTemporaryPost().setAuthor(
            getAuthenticationController().getAuthenticationEJB()
                    .getCurrentSessionUser());
    postEJB.create(getTemporaryPost());
}
    }
我想摆脱

@ManagedProperty(value=“#{authenticationController}”) 私有身份验证控制器AuthenticationController

并直接注入AuthenticationEJB,如

@注入私有身份验证EJB AuthenticationEJB

因此,与其

getAuthenticationController().getAuthenticationEJB() .getCurrentSessionUser()

我会得到

authenticationEJB.getCurrentSessionUser()

但是,问题是这是新的authenticationEJB实例,它不包含当前登录的用户(用户为null)。同时authenticationController.authenticationEJB.currentsessionuser包含登录用户

提前谢谢



终于找到答案了!这很容易:

@ManagedProperty(value = "#{authenticationController.authenticationEJB}")
private AuthenticationEJB authenticationEJB;

现在它指向同一个authenticationEJB实例。不过,我相信可能还有其他方法

好吧,你知道答案了,但也许有几条注释

  • 为什么不使用
    @EJB
    注释将bean直接注入
    PostController
  • 如果您开发一个新项目,使用
    cdibeans
    而不是JSF管理的bean,它们很快就会被弃用(而且整个javaee堆栈正在缓慢地向到处使用CDI的方向发展)
  • 然后您可以去掉
    @ManagedProperty
    ,每个bean(基本上是应用程序中的任何类)都可以通过
    @Inject
    注释进行注入。同样的事情也适用于EJB,所以CDI在某种程度上统一了对大多数类型bean的访问
  • 一些基本的CDI+JSF教程

您是否尝试过使用
@SessionScoped
处理
后控制器
托管bean?只是尝试了一下,@SessonScoped没有帮助。对于EJB,我使用
@EJB
而不是
@Inject
,这可能对您有帮助不,这也没有帮助。但我找到了一个。我现在就发!终于找到答案了!这很简单:@ManagedProperty(value=“#{authenticationController.authenticationEJB}”)private authenticationEJB authenticationEJB;现在它指向同一个authenticationEJB实例。不过,我相信可能还有其他方法可以做到这一点。好吧,谢谢你的建议,我对这堆技术真的很陌生。我尝试过注入EJB,但据我所知,它为postController创建了一个新的EJB实例。示例:postController.authenticationEJB包含与AuthenticationController.authenticationEJB不同的数据。感谢CDI,不知道一切都发生了如此巨大的变化!这对于无状态的bean是正确的,但是你写到你的bean是有状态的,所以你应该在注入到的每个bean中得到相同的实例。我真的很困惑,也许我明天会详细检查它。是的,AuthenticationEJB是有状态的LocalBean。但是,当我将ManagedProperty(value=#{authenticationController.authenticationEJB})更改为EJB时,由于用户字段中为null(此处的用户是post作者),因此无法保存post。在另一种情况下,evrything可以正常工作。。如果我在这个JSF中使用EJB注释:
  • 登录后,会有类似于:ilja anonymous的输出,所以它们不会相互映射。可能吧?