java - 每个请求都会创建注入(inject) @Model bean 的 EJB (GlassFish)

标签 java jsf glassfish ejb cdi

我在网上找不到任何相关内容或任何引用。问题就在这里

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

  • index.xhtml
<pre> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Index</title> </h:head> <h:body> <h:form> <h:panelGrid> <h:outputText value="#{myBean.message}" /> <h:inputText value="#{myBean.name}" /> <h:commandButton action="#{myBean.sayHello()}" value="Say Hello"> <f:ajax execute="@form" render="@form" /> </h:commandButton> </h:panelGrid> </h:form> </h:body> </html> </pre>

  • MyBean.java

<pre> import javax.enterprise.inject.Model; import javax.inject.Inject; @Model public class MyBean { @Inject private MyEJB myEjb; public MyBean() { System.out.println("Creating MyBean"); } private String name; private String message; public void sayHello() { setMessage(myEjb.sayHello(getName())); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </pre>

  • MyEJB.java

<pre> import javax.ejb.Stateless; @Stateless public class MyEJB { public MyEJB() { System.out.println("Creating MyEJB"); } public String sayHello(String name) { return "Hello " + name; } } </pre>

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

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

根据单个请求。

这意味着 MyBean 根据请求创建了 3 次,MyEJB 则创建了 3 次

我想知道这是正常行为还是 glassfish 上的错误,或者我可能在这里做了一些真正错误的事情,因为如果在每个请求上创建和销毁这么多对象,那么严肃的应用程序将会出现问题。

如果我改用这样更经典的方法

<pre> import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @RequestScoped @ManagedBean public class MyBean { @EJB private MyEJB myEjb; public MyBean() { System.out.println("Creating MyBean"); } private String name; private String message; public void sayHello() { setMessage(myEjb.sayHello(getName())); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </pre>

输出不同

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

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

谢谢

最佳答案

调试 EJB/CDI/JSF/... 组件的构造函数是一个错误的 friend 。

在现代框架中,有很多事情在幕后进行 - 其中相当多的事情使用 Java 反射 - 并且您不能依赖对构造函数的调用来表明您拥有一个新鲜且随时可用的组件。

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

在您的情况下,请使用@PostConstructdocumentation here .

关于java - 每个请求都会创建注入(inject) @Model bean 的 EJB (GlassFish),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942592/

相关文章:

JavaMelody - 在 GlassFish v3+ 中监控 sql 请求和 jdbc 连接

jpa - 如何在 GlashFish 4.0 中更改 EclipseLink?

java - Java中的正则表达式检查双辅音

Java - 在主类中放置多少逻辑?

java - 使用 Tomahawk 将数据导出为 PDF 格式?

regex - 验证器正则表达式模式输入仅接受 2-5 位数字

ajax - 本地主机拒绝连接 - ERR_CONNECTION_REFUSED

java - LibGdx FPS 太多了。如何限制?

Java Swing 绘制矩形

jsf - URL jsf2中的参数