5

我在从应用程序客户端访问有状态会话 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”运行,如“如何在 JBoss 5 中使用应用程序客户端”中所述。在执行 init() 期间调用(本地)ABean 上的 someMethod() 之前,查找“BBean”工作正常。在该调用期间,容器抛出 InvalidStateException("Local call: security context is null") (作为根本原因)。当我将有状态 bean 更改为无状态 bean 时,一切正常(当然,除了没有保留状态)。有趣的是,我可以很好地使用来自 Web 应用程序(在 JSF 托管 bean 中)的完全相同的 SFSB。

难道我做错了什么?我应该如何从应用程序客户端使用 SFSB?

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

4

2 回答 2

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 应用程序中使用它(无需身份验证即可访问 EJB)。

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

于 2009-05-14T09:47:41.763 回答
0

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

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

hth,
-马丁

于 2012-07-19T13:28:35.193 回答