我在从应用程序客户端访问有状态会话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中修复,似乎不是同一个问题。
答案 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)