访问无状态内的现有实例有状态,java ee 6

Ale*_*lex 4 java-ee stateful-session-bean ejb-3.0

是否可以在无状态bean中访问有状态会话bean?

我的问题是我有一个名为User的会话bean,我想在无状态bean中访问用户信息...

我这样想:

Ejb Side:

@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返回一个新实例...

  1. 我知道为什么这不起作用.因为我的考试失败了:P.我得到一个新的实例..
  2. 我想检查EJB中登录用户的某些权限,因为我不想指望客户端因为我可能在那里犯了错误,或者我会告诉其他开发人员为我的项目制作GUI.
  3. 我不想使用Java EE安全因为我不知道如何在RCP应用程序中进行登录
  4. 我的主要问题是:如何在EJB中访问会话bean(客户端拥有的会话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,因此这个答案应该易于理解.