Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaEE6:如何从无状态会话Bean调用有状态会话Bean?_Java_Ejb_Stateless Session Bean_Stateful Session Bean - Fatal编程技术网

JavaEE6:如何从无状态会话Bean调用有状态会话Bean?

JavaEE6:如何从无状态会话Bean调用有状态会话Bean?,java,ejb,stateless-session-bean,stateful-session-bean,Java,Ejb,Stateless Session Bean,Stateful Session Bean,我有一个有状态会话Bean(SFSB),它充当身份验证模块。在SFSB中,我存储当前登录的用户。此外,我还有一些Facade(即无状态会话bean(SLSB))来处理实体的JPA/SQL内容。为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB。但从SLSB调用时,当前用户字段始终为“null”。直接调用SFSB时,当前用户字段设置正确。。。对于调用,我使用@EJB注释 你知道问题出在哪里吗?这是一个背景问题吗?通常可以从SLSB调用SFSB以保持其状态吗 非常感谢 您不应该从无状态会话b

我有一个有状态会话Bean(SFSB),它充当身份验证模块。在SFSB中,我存储当前登录的用户。此外,我还有一些Facade(即无状态会话bean(SLSB))来处理实体的JPA/SQL内容。为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB。但从SLSB调用时,当前用户字段始终为“null”。直接调用SFSB时,当前用户字段设置正确。。。对于调用,我使用@EJB注释

你知道问题出在哪里吗?这是一个背景问题吗?通常可以从SLSB调用SFSB以保持其状态吗


非常感谢

您不应该从无状态会话bean调用有状态会话bean

以下是一些阅读:

无状态bean对会话一无所知。任何时候你叫它,它都是无状态的。然后它调用一个有状态会话bean。毫不奇怪,它没有任何与客户端会话状态相关的上下文,因为它是从无状态对象调用的

我不知道它是否有效,但您可能可以尝试通过执行JNDI查找来获取上下文,而不是使用@EJB符号进行DI。在无状态ejb中类似这样的东西可能会起作用。你可能得玩它,我不能保证什么。它应该获得调用无状态ejb的客户端的上下文。客户端将需要会话上下文/范围,否则就忽略它

@Resource SessionContext sessionContext;

MyStatefulBean msb = (MyStatefulBean)sessionContext.lookup("ejb/MyStatefulBean");
msb.doSomething(fubar);

最好从具有会话作用域的客户机或另一个有状态ejb调用有状态会话bean。无状态和有状态有不同的原因

如果通过查找将有状态会话bean注入到无状态bean中,也不起作用,因为将为有状态bean创建新实例,因此它不包含任何值,如记录的用户信息等。

您不应该将有状态EJB注入无状态EJB。这可能会产生非常不可预测的后果,因为有状态EJB的生命周期是在注入时启动的,并由拥有它的bean进行管理。在最坏的情况下,应用服务器可以为不同的用户重用无状态EJB,然后这些用户将访问相同的有状态EJB。在您的情况下,用户将被标识为不同的用户

很可能您希望将有状态EJB与当前HTTP会话相关联,这并不像许多人所认为的那样是自动完成的。有关更多详细信息,请阅读名为EJB3的部分,此处没有上下文:

为了将有状态EJB与会话相关联,您需要将有状态EJB注入会话作用域CDIBean,该CDIBean可以自由地注入无状态bean——实际上,只注入存根,并且为每个新会话创建会话作用域bean(与有状态EJB一起)


也许更好的方法是提取有状态bean的接口,并使用CDI生产者创建有状态bean的会话范围实现。通过这种方式,您还可以处理这样的情况,即在EJB中出现异常时自动删除有状态EJB。在这种情况下,您可能希望在同一会话中重新创建EJB。

也许您可以尝试将对SFSB的引用传递给您的SLSB。。。从未尝试过,但它似乎可以工作。是的,这正是我通过使用@EJB注释的依赖项注入所要做的。但这不起作用…我不是指依赖注入。我的意思是将SFSB作为方法参数传递。依赖注入在这种情况下没有意义。请记住,SLSB只是坐在池中等待服务请求。他们根本没有状态,也不知道是谁在调用它们。他们只是执行任务。谢谢你的回答。但这对我不起作用。。。SFSB仍然没有会话上下文。还有其他想法吗?为了使用SessionContext,必须在之前成功地通过安全域的身份验证。