私は魂やこれへの言及をウェブ上で見つけることができません。ここに問題があります
私は非常に単純なWebプロジェクトを持っています
- index.xhtml
<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>
- MyBean.java
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;
}
}
- MyEJB.java
import javax.ejb.Stateless;
@Stateless
public class MyEJB
{
public MyEJB()
{
System.out.println("Creating MyEJB");
}
public String sayHello(String name)
{
return "Hello " + name;
}
}
これは正しく機能しますが、グラスフィッシュのログにはこれが表示されます
情報: MyBean を作成しています 情報: MyBean を作成しています 情報: MyEJB を作成しています 情報: MyBean を作成しています 情報: MyEJB を作成しています 情報: MyEJB を作成しています
単一の要求で。
つまり、リクエストで MyBean が 3 回作成され、MyEJB が 3 回作成されたことを意味します。
これが通常の動作なのか、グラスフィッシュのバグなのか、それともここで何か本当に間違ったことをしているのかもしれません。なぜなら、リクエストごとに非常に多くのオブジェクトが作成および破棄されると、深刻なアプリケーションに問題が生じるからです。
このようなより古典的なアプロシェに変更すると
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;
}
}
出力が異なります
私は1つのejbを作成し、残りのリクエストはそのインスタンスによって処理され、MyBeanはリクエストごとに1回作成されます。
助けてください多分私はcdi仕様を誤解しています。
ありがとう