Sim*_*ann 5 java stateful-session-bean application-client ejb-3.0
我在从应用程序客户端访问有状态会话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();
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序客户端通过"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>
Run Code Online (Sandbox Code Playgroud)
我已经在 Web 应用程序的 jboss-web.xml 以及 EJB 项目的 jboss.xml 中使用了这个安全域,尽管我实际上只在 Web 应用程序中使用它(EJB 无需身份验证即可访问)。
为了解决访问 SFSB 的问题,我只需从 EJB 项目中的 jboss.xml 中删除我的安全域。然后,这使得 JBoss 使用默认安全域,这似乎做了正确的事情,我的应用程序客户端最终可以访问和使用 SFSB。
归档时间: |
|
查看次数: |
6653 次 |
最近记录: |