1

私は魂やこれへの言及をウェブ上で見つけることができません。ここに問題があります

私は非常に単純な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仕様を誤解しています。

ありがとう

4

1 に答える 1

1

EJB / CDI / JSF / ... コンポーネントのコンストラクターをデバッグすることは、間違った友達です。

最新のフレームワークでは、舞台裏で多くの処理が行われています (そのかなりの部分が Java リフレクションを使用しています)。また、コンストラクターの呼び出しに依存して、新しくすぐに使用できるコンポーネントがあることを示すことはできません。

あなたがしなければならないことは、適切なライフサイクル フックの 1 つを使用することです。これらは、コンポーネントが作成/破棄/非パッシベート/パッシベーションされた後/前に呼び出されるように明示的に設計されています。

あなたの場合は、こちら@PostConstructドキュメントを使用してください。

于 2012-06-08T04:26:33.113 に答える