1

我在网上找不到灵魂或任何参考。这是问题所在

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

  • 索引.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;
        }

    }

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

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

在一个请求上。

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

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

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

    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 为每个请求创建一次。

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

谢谢

4

1 回答 1

1

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

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

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

在您的情况下,请使用此处@PostConstruct文档

于 2012-06-08T04:26:33.113 回答