Ale*_*lex 4 java-ee stateful-session-bean ejb-3.0
是否可以在无状态bean中访问有状态会话bean?
我的问题是我有一个名为User的会话bean,我想在无状态bean中访问用户信息...
我这样想:
@Stateless
public class OfferManagerBean implements OfferManagerLocal, OfferManager
{
@Resource
private SessionContext context;
@EJB
private ro.project.ejb.interfaces.User user;
public String getUsername()
{
user = (ro.project.ejb.interfaces.User) context.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
return user.getUsername();
}
Run Code Online (Sandbox Code Playgroud)
User user = (User) ctx.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
user.setUsername("Alex");
OfferManager offerManager = (OfferManager) ctx.lookup("java:global/project/projectEJB/OfferManagerBean!ro.project.ejb.interfaces.OfferManager");
assertEquals(offerManager.getUsername(), "Alex");
Run Code Online (Sandbox Code Playgroud)
这个测试用例的结果是 java.lang.AssertionError: expected:<null> but was:<Alex>
它失败..似乎我如何请求有状态的bean返回一个新实例...
我问的是这个人问的几乎一样的东西:rmi ejb调用中可重用登录会话的概念
我想这样做但不是JAAS ...
先感谢您
Bal*_*usC 10
您永远不应该@Stateful在@Statelessbean(SLSB)中注入bean(SFSB ).只要客户端存在,SFSB就会存在(客户端是注入SFSB的实例,在本例中是SLSB本身).然而,SLSB的意图是无国籍,大多数容器都将它们放在池中.因此,每当SLSB在使用后返回池中时,它将在其他地方重新使用,但它保存与第一次创建SLSB时相同的SFSB实例!这可能导致不希望的结果.
此外,每当您从JNDI获得SFSB时,您将获得一个全新的实例,这与其他地方未共享的SLSB不同.然后,SFSB的客户端是您从JNDI获得SFSB的当前客户端类实例.您应该自己保留此实例并重复使用相同的实例,直到您完成对其执行事务为止.其中一种方法是将它自己存储在HTTP会话中,或者存储在您正在使用的MVC框架的会话作用域托管bean中.
函数要求对我来说并不完全清楚,因此很难给出一个合适的答案来解决你的特定问题,但我觉得你实际上需要将用户存储在HTTP会话中,而不是存储在SFSB中.最常见的初学者对会话bean的错误就是他们错误地将EJB上下文中的"会话"解释为HTTP会话.
另请参阅相关问题的相关答案,以获得更深入的解释:JSF请求作用域bean在每次请求时都会继续重新创建新的有状态会话bean吗?根据您的问题历史,您熟悉JSF,因此这个答案应该易于理解.
| 归档时间: |
|
| 查看次数: |
4535 次 |
| 最近记录: |