我使用Java EE 6与Glassfish 3.1.2.2。我在那里有一个EJB项目,其中包含无状态会话bean,还有一个WEB项目,其中包含已命名的会话作用域类。
例如:
命名类
@Named
@SessionScoped
public class MyWebController implements Serializable {
@EJB
private MyBean myBean;
}
EJB类
@Stateless
public class MyBean {
@PersistenceContext
private EntityManager em;
}
项目正在运行,但是当我进行代码分析时,我得到以下消息:
可序列化类中的非瞬态非序列化实例字段
这个Serializable类定义了一个非原语的实例字段,它既不是transient的,也不是Serializable的,也不是java.lang的。对象,并且似乎没有实现Externalizable接口或readObject()和writeObject()方法。如果在此字段中存储了不可序列化的对象,则该类的对象将无法正确反序列化。
有人知道,我可以重构我的代码来避免这个吗?
我不是这些话题的专家,但是试试这个:
1)确保你使用的是正确的@SessionScoped
注释:
@Named
@javax.enterprise.context.SessionScoped
public class MyWebController implements Serializable {
@EJB
private MyBean myBean;
}
2)尝试使用EJB serializable:
@Stateless
public class MyBean implements Serializable {
...
}
3)如果这个溶液一直破裂。尝试用@Inject
代替@EJB