将相同的有状态ejb实例注入不同的管理Bean

时间:2013-10-02 20:34:28

标签: java-ee ejb managed-bean

我正在尝试在JSF上构建一个简单的博客。但是,我不知道如何将相同的有状态ejb实例注入2个不同的托管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}”)   private AuthenticationController authenticationController;

直接注入AuthenticationEJB,如

  

@Inject private AuthenticationEJB authenticationEJB;

所以,而不是

  

getAuthenticationController()。getAuthenticationEJB()                           .getCurrentSessionUser()

我会得到

  

authenticationEJB.getCurrentSessionUser()

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

提前致谢!


Finnaly得到了答案!很容易:

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

现在它指向同一个authenticationEJB实例。但是,我相信可能还有其他一些方法可以做到这一点。

1 个答案:

答案 0 :(得分:0)

嗯,你得到了答案,但也许有几个笔记

  • 为什么不用PostController注释直接将bean注入@EJB
  • 如果您开发一个新项目,使用CDI beans而不是JSF Managed Beans,它们很快就会被弃用(并且整个Java EE堆栈正逐渐向所有CDI使用)
  • 然后你可以摆脱@ManagedProperty,每个bean(基本上是你的应用程序中的任何类)将获得注入@Inject注释。同样的事情适用于EJB,因此CDI类型统一了对大多数类型的bean的访问。
  • 一些基本的CDI + JSF教程here