Java Jboss 6.3:有状态bean:无法使容器保持会话状态

Java Jboss 6.3:有状态bean:无法使容器保持会话状态,java,ejb-3.0,stateful,Java,Ejb 3.0,Stateful,场景:用户点击“生成列表”,系统显示列表。然后,用户输入电子邮件地址并单击“发送列表” 有两个客户机-服务器请求,因此为了避免两次读取数据库,我设置了一个EJB3有状态bean。问题是我无法让bean在多个客户机-服务器请求之间保持会话状态 代码:本地接口 @Local public interface IList{ public void setList(Collection<String> list); public Collection<String&

场景:用户点击“生成列表”,系统显示列表。然后,用户输入电子邮件地址并单击“发送列表”

有两个客户机-服务器请求,因此为了避免两次读取数据库,我设置了一个EJB3有状态bean。问题是我无法让bean在多个客户机-服务器请求之间保持会话状态

代码:本地接口

@Local
public interface IList{

    public void setList(Collection<String> list);

    public Collection<String> getList();

    public void remove();


}
在下一个请求中,我再次查找它并调用getList()

注: 我已经更改了类名、方法名和查找名,因为我无法向您显示实际的代码

没有记录任何错误。调试代码后,我发现数据不可用


我的系统上有另一个有状态bean,它的编码完全相同,并且可以正常工作。不确定这为什么不起作用。

每次在有状态EJB bean上执行编程JNDI查找时,您都会收到该EJB的全新实例。这意味着,在您的情况下,它会按预期工作。 您需要做的是将对SFSB的引用存储在某个位置,例如HttpSession对象内部。然后,在后续请求中,您将获得与上一个请求相同的SFSB实例

我的系统上有另一个有状态bean,它的编码完全相同,并且可以正常工作


这很有趣。你确定它们的编码完全相同吗?你能分享一段代码吗?

我百分之百肯定,它与此相同。区别仅在于类名及其方法名。另外,我还没有将其存储在HttpSession中。澄清:如果同一客户机再次查找,容器是否会将有状态bean保存在其bean池中,并返回先前创建的确切bean。参考这个问题否,有状态bean不是池。那么,如果不在会话中存储对接口的引用,就不可能实现我的场景吗?我怀疑如果不存储somehweere(例如会话),这是可能的。顺便说一句,你能展示另一个有状态bean的代码吗?
@Stateful
public class List implements IList{

    private Collection<String> list;

    @Override
    public void setList(Collection<String> list) {

        this.list= list;

    }

    @Override
    public Collection<String> getList() {

        return this.list;

    }

    @Remove
    @Override
    public void remove(){

    }
}
<session>
    <ejb-name>List</ejb-name>
    <ejb-class>com.lists.List</ejb-class>
</session>
InitialContext ic = new InitialContext();
IList irc = (IList)ic.lookup("java:global/rdb/rdb.jar/List!com.lists.IList");
irc.setList(list);
InitialContext ic = new InitialContext();
IList irc = (IList)ic.lookup("java:global/rdb/rdb.jar/List!com.lists.IList");
list = irc.getList();