【问题标题】:EJB injected in @Model bean gets created on every request (GlassFish)注入@Model bean 的 EJB 会在每个请求时创建(GlassFish)
【发布时间】:2012-06-08 03:06:36
【问题描述】:

我在网上找不到灵魂或任何参考。问题来了

我有一个非常简单的网络项目

  • index.xhtml
索引

  • MyBean.java

导入 javax.enterprise.inject.Model; 导入 javax.inject.Inject; @模型 公共类 MyBean { @注入 私人MyEJB myEjb; 公共 MyBean() { System.out.println("创建 MyBean"); } 私有字符串名称; 私人字符串消息; 公共无效sayHello() { setMessage(myEjb.sayHello(getName())); } 公共字符串 getMessage() { 返回消息; } 公共无效 setMessage(字符串消息) { this.message = 消息; } 公共字符串 getName() { 返回名称; } 公共无效集合名称(字符串名称) { this.name = 名称; } }

  • MyEJB.java

导入 javax.ejb.Stateless; @无状态 公共类 MyEJB { 公共 MyEJB() { System.out.println("创建 MyEJB"); } 公共字符串sayHello(字符串名称) { 返回“你好”+名字; } }

这可以正常工作,但 glassfish 日志显示了这一点

信息:创建 MyBean 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyEJB

单个请求。

这意味着 MyBean 在请求中被创建了 3 次,而 MyEJB 被创建了 3 次

如果这是正常行为,或者它是 glassfish 上的错误,或者我在这里做错了什么,我会徘徊,因为如果在每个请求上创建和销毁这么多对象,seriuos 应用程序就会出现问题。

如果我换成这样更经典的 aproche

导入 javax.ejb.EJB; 导入 javax.faces.bean.ManagedBean; 导入 javax.faces.bean.RequestScoped; @RequestScoped @ManagedBean 公共类 MyBean { @EJB 私人MyEJB myEjb; 公共 MyBean() { System.out.println("创建 MyBean"); } 私有字符串名称; 私人字符串消息; 公共无效sayHello() { setMessage(myEjb.sayHello(getName())); } 公共字符串 getMessage() { 返回消息; } 公共无效 setMessage(字符串消息) { this.message = 消息; } 公共字符串 getName() { 返回名称; } 公共无效集合名称(字符串名称) { this.name = 名称; } }

输出不一样

我创建了 1 个 ejb,然后请求的其余部分由该实例处理 并且 MyBean 为每个请求创建一次。

请帮助我,也许我错过了 cdi 规范。

谢谢

【问题讨论】:

  • 好吧抱歉,首先它没有创建 3 次 bean,它是每个请求一个,我在浏览器上按 f5,我通过添加 @Named 来解决 EJB 创建问题。但我在我读过的任何 cdi 教程中都没有看到这个要求,所以我很困惑
  • 了解您的第二个代码示例没有什么“经典”。第一个使用 CDI 进行注入,第二个使用 JSF 和 EJB 进行注入,这是两种截然不同的模型。 @Model 是 RequestScoped 和 Named 的 CDI 版本的快捷方式。所以是的,您的模型对象将被创建多次。

标签: java jsf glassfish ejb cdi


【解决方案1】:

调试 EJB / CDI / JSF / ... 组件的构造函数是错误的朋友。

在现代框架中,在幕后发生了很多事情——其中相当一部分使用 Java 反射——你不能依赖对构造函数的调用来表明你有一个新的和即用型组件。

您需要做的是使用适当的生命周期挂钩之一。这些被明确设计为在创建/销毁/去钝化/钝化组件之后/之前调用。

在你的情况下,使用@PostConstructdocumentation here

【讨论】:

    猜你喜欢
    • 2013-08-26
    • 2011-11-05
    • 2012-01-29
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2014-10-12
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多