Java Jboss 6.3:有状态bean:无法使容器保持会话状态
场景:用户点击“生成列表”,系统显示列表。然后,用户输入电子邮件地址并单击“发送列表” 有两个客户机-服务器请求,因此为了避免两次读取数据库,我设置了一个EJB3有状态bean。问题是我无法让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&
@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();