繁体   English   中英

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

[英]EJB 3: Accessing a stateful session bean from an 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”运行,如“如何在JBoss 5中使用应用程序客户端”中所述 执行“BBean”查找工作正常,直到在执行init()期间调用(本地)ABean上的someMethod()。 在该调用期间,容器抛出InvalidStateException(“本地调用:安全上下文为空”)(作为根本原因)。 当我将有状态bean更改为无状态bean时,一切正常(当然,除非保留状态)。 有趣的是,我可以使用Web应用程序(在JSF托管bean中)完全相同的SFSB。

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

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

即使我仍然想知道为什么我的原始设置它适用于无状态会话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。

原因可以在EJB 3.0核心规范第12.4节中找到。 它说

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

心连心,
- 马丁

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM