EJB:@对另一个EAR的本地调用



我使用的是EJB 3.1和Wildfly 8.2.Final

耳朵1:

jar-impl with Bean1 (where I execute the lookup of Interface2)
lib /
jar with Interface2

耳朵2:

jar-impl with Bean2
lib / 
jar with Interface2 and META-INF/ejb-jar.xml

我想在用@Local注释的Interface2的Bean1中执行查找。

"查找"代码:

Properties jndiProp = new Properties();
InitialContext ctx = new InitialContext(jndiProp);
Object bean = ctx.lookup(JNDI);
Interface2 interface = (Interface2) bean;

如果我用@Remote注释Interface2,启动时的wildfly会写道:

java:global/c4c.commons.backend/c4c.commons.backend-impl/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:app/c4c.commons.backend-impl/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:module/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:jboss/exported/c4c.commons.backend/c4c.commons.backend-impl/CMSRemoteServiceBean!eu.dedalus.c4c.commons.service.Interface2
java:global/c4c.commons.backend/c4c.commons.backend-impl/Bean2
java:app/c4c.commons.backend-impl/Bean2
java:module/Bean2

具有

JNDI="ejb:c4c.commons.backend/c4c.commons.backend impl/Bean2!eu.dedalus.c4c.commons.cervice.Interface2">

一切顺利。。但当我用@Local witch注释Interface2时,我想做的事情是,启动时的wildfly写道:

java:global/c4c.commons.backend/c4c.commons.backend-impl/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:app/c4c.commons.backend-impl/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:module/Bean2!eu.dedalus.c4c.commons.service.Interface2
java:global/c4c.commons.backend/c4c.commons.backend-impl/Bean2
java:app/c4c.commons.backend-impl/Bean2
java:module/Bean2
  • 如果我使用"ejb:"前缀执行查找操作很顺利,但当我尝试调用bean的任何方法时,它会抛出:"JBAS014151:找不到视图">
  • 如果我使用"java:global/"前缀执行查找会很好,但当我尝试访问接口时,我会得到一个java.lang.ClassCastException:HelloWorldRemote$$view4无法转换为HelloWorldRemote

    这可能是因为我在两个不同的耳朵里有两个接口"接口2"?但是,为什么遥控器不会出现错误呢?

    使用@Local调用而不是@Remote对本地调用有用吗?我读过几本书,比较好的一本是:https://coderanch.com/t/79249/application-servers/Local-EJB-calls-separate-ear

    但我仍然有困惑的想法。请在答复中提供官方文档的文档链接。

请参阅EJB 3.x规范以获得澄清,例如EJB 3.2规范第3.2.2节:

只能通过本地客户端视图访问企业bean需要为打包在同一个内的本地客户端提供支持应用程序作为提供本地客户端的企业bean看法本规范的兼容实施方式可以是可选的支持从打包在不同应用程序中的本地客户端。配置对本地客户端视图的应用程序间访问的要求如下特定于供应商,不在本规范的范围内。依赖于对本地客户端的应用程序间访问的应用程序视图是不可移植的。

使用远程接口通常需要对方法参数和返回对象进行编组和解编组,以及明确的类加载器分离。

如果您需要从另一个JVM(例如远程客户端(或同一应用程序服务器内的另一个应用程序范围进行访问,请使用远程EJB。如果您只想在应用程序范围内提供对EJB的访问,请使用本地EJB。

最新更新