【问题标题】:Inject same stateful ejb instance into different managedbeans将相同的有状态 ejb 实例注入不同的 managedbeans
【发布时间】:2013-10-02 20:34:28
【问题描述】:

我正在尝试在 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 实例,它不包含当前登录的用户(用户为空)。同时 authenticationController.authenticationEJB.currentsessionuser 包含登录用户。

提前致谢!


终于找到答案了!很简单:

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

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

【问题讨论】:

  • 您是否尝试过将@SessionScoped 用于PostController 托管bean?
  • 刚刚试过,@SessonScoped 没有帮助。
  • 对于 EJB,我使用 @EJB 而不是 @Inject,也许对你有帮助
  • 不,这也没有帮助。但我找到了anwser。我马上贴出来!
  • 终于找到答案了!很简单:@ManagedProperty(value = "#{authenticationController.authenticationEJB}") private AuthenticationEJB authenticationEJB;现在它指向同一个 authenticationEJB 实例。但是,我相信可能还有其他方法可以做到这一点。

标签: jakarta-ee ejb managed-bean


【解决方案1】:

嗯,你得到了答案,但也许有几个注释

  • 为什么不直接将 bean 注入带有 @EJB 注释的 PostController
  • 如果您开发一个新项目,请使用 CDI beans 而不是 JSF 托管 Bean,它们很快就会被弃用(整个 Java EE 堆栈正在慢慢转向在任何地方使用 CDI)
  • 然后你可以摆脱@ManagedProperty,每个bean(基本上是你应用程序中的任何类)都可以通过@Inject注解注入。同样的事情也适用于 EJB,因此 CDI 统一了对大多数类型 bean 的访问。
  • 一些基本的CDI + JSF教程here

【讨论】:

  • 好吧,感谢您的建议,我对这堆技术真的很陌生。我曾尝试注入 EJB,但据我所知,它会为 postController 创建一个新的 EJB 实例。示例:postController.authenticationEJB 包含与 authentificationController.authenticationEJB 不同的数据。感谢 CDI,没想到一切都发生了如此巨大的变化!
  • stateless bean 确实如此,但您写道您的 bean 是 stateful,因此您应该在注入的每个 bean 中获得相同的实例。
  • 我真的很困惑,也许我明天再详细检查一下。是的,AuthenticationEJB 是有状态的 LocalBean。但是当我将 ManagedProperty(value = #{authenticationController.authenticationEJB}") 更改为 EJB 时,由于用户字段为空(这里的用户是帖子作者),因此无法保存帖子。在其他情况下,一切都可以正常工作..
  • 如果我在这个 JSF 中使用 EJB 注释:
  • a>
  • 登录后有输出喜欢:ilja 匿名 所以,它们不会相互映射。大概?
猜你喜欢
相关资源
最近更新 更多
热门标签