EJB 3:从应用程序客户端访问有状态会话bean

时间:2009-05-13 14:20:44

标签: java ejb-3.0 stateful-session-bean application-client

我在从应用程序客户端访问有状态会话bean(SFSB)时遇到了一些麻烦。我正在使用JBoss 5.0.1.GA.应用程序客户端和EJB都打包在一个部署的EAR中,我有其他应用程序客户端可以正常工作。到目前为止,我只使用了无状态会话bean(SLSB),但据我所知,SLSB和SFSB之间的差异不应影响从应用程序客户端访问它们的方式。

类/接口的结构:

@Local public interface A {...}

@Stateless public class ABean implements A {...}

@Remote public interface B {...}

@Stateful public class BBean implements B {
    @EJB private A anInstanceOfA;

    @PostConstruct private void init() {
        this.anInstanceOfA.someMethod();
    }
}

应用程序客户端通过“{appclient-launcher”运行,如"How to use an application client in JBoss 5"中所述。执行“BBean”查找工作正常,直到在执行init()期间调用(本地)ABean上的someMethod()。在该调用期间,容器抛出InvalidStateException(“本地调用:安全上下文为空”)(作为根本原因)。当我将有状态bean更改为无状态bean时,一切正常(当然,除非保留状态)。有趣的是,我可以使用Web应用程序(在JSF托管bean中)完全相同的SFSB。

我做错了吗?我应该如何从应用程序客户端使用SFSB?

到目前为止,我还没有找到有关此特定问题的任何有用信息。在[#JBAS-4317] Security Context over the invocation的类似上下文中提到了异常,但考虑到它被标记为已完成并在JBoss 5.0.0.Beta3中修复,似乎不是同一个问题。

2 个答案:

答案 0 :(得分:1)

尽管我仍然想知道为什么我的原始设置适用于无状态会话bean但不适用于有状态会话bean,这是我找到的解决方案:

同样打包在EAR中的Web应用程序通过JAAS进行身份验证。为此,我在JBoss login-config.xml中配置了一个安全域,如下所示:

<application-policy name="My-SD">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="unauthenticatedIdentity">guest</module-option>
            <module-option name="dsJndiName">java:/myDS</module-option>
            <module-option name="principalsQuery">SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0</module-option>
            <module-option name="rolesQuery">SELECT ROLE, 'Roles' FROM USER_ROLE WHERE LOGIN = ?</module-option>
        </login-module>
    </authentication>
</application-policy>

我已经在web应用程序的jboss-web.xml以及EJB项目的jboss.xml中使用了这个安全域,即使我实际上只在web-app中使用它(EJB可以在没有身份验证的情况下访问) )。

要解决访问SFSB的问题,我只需要从EJB项目的jboss.xml中删除我的安全域。这使得JBoss使用默认的安全域,这似乎是正确的,我的应用程序客户端最终可以访问和使用SFSB。

答案 1 :(得分:0)

原因可以在EJB 3.0 Core Specification第12.4节找到。在那里说

  

生命周期回调拦截器方法在未指定的事务和安全上下文中调用。

HTH,
- 马丁