注入EJB到SessionScoped ManagedBean在取消部署时会生成异常

时间:2011-12-30 13:24:48

标签: java netbeans jsf-2 glassfish ejb

  1. 使用GlassFish 3.1上的NetBeans 7启动新的Web应用程序
  2. 在index.xhtml正文中添加h:outputText标记value="#{myBean.message}"
  3. 使用名为SessionScoped的字符串属性创建ManagedBean MyBean message;创建getter和setter;使其实施Serializable
  4. 使用Stateless注释创建SessionBean MyBean并将其注入@EJB
  5. 从现在开始,无论何时更改Java代码并保存项目,在取消部署期间都会遇到大量错误(NPE,IOError,EJB错误)。部署很好,应用程序运行良好。但我想避免在取消部署期间出现例外情况。
  6. 这是正常的吗?或者我做错了什么?

    这是我的代码:

    Index.xhtml (正文部分)

        <h:body>
            <h:outputText value="#{myBean.message}"></h:outputText>
        </h:body>
    

    MyBean.Java

    @ManagedBean
    @SessionScoped
    public class MyBean implements Serializable {
    
        @EJB NewSessionBean nsb;
    
        public String getMessage() {
            return " " + nsb.toString();
        }
    
        public MyBean() {
        }
    }
    

    NewSessionBean.java

    @Stateless
    @LocalBean
    public class NewSessionBean {
    }
    

    为了获取错误,只需加载网页,在消息字符串中添加空格,保存java文件(自动部署切换,否则手动重新部署)。

    有些例外

    EJB5014: Exception resolving object 
    java.lang.NullPointerException at    
    com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate$SerializableLocalObjectDelegate.createObject(EJBLocalObjectInvocationHandlerDelegate.java:158)
    
    IOException while loading persisted sessions: java.io.IOException
    java.io.IOException
    at com.sun.ejb.base.io.EJBObjectInputStream.resolveObject(EJBObjectInputStream.java:114)
    

    更新

    如果我将ManagedBean注释替换为Named,因此使用CDI,然后将javax.faces.bean.SessionScoped替换为javax.enterprise.context.SessionScoped,我遇到完全相同的问题取消部署,后续应用程序运行顺利。

    抛出的异常与之前完全相同。

1 个答案:

答案 0 :(得分:0)

您的服务器尝试序列化并保存http会话。您的会话bean应该可序列化以使会话持久性可用。 Ir看起来像这个引用:NewSessionBean nsb;不可序列化。你可以让它瞬态,你应该摆脱错误。但是在sesson恢复之后,nsb将为null。我不确定它是如何在EJB中处理的,但必须以某种方式重新注入此引用。