我正在使用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.service.Interface2”
一切都很好..但是当我想用@Local witch注释Interface2时,启动时的野蝇写道:
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
如果我执行带有“ java:global /”前缀的查找,效果很好,但是当我尝试使用该接口时,会得到一个 java.lang.ClassCastException:无法将HelloWorldRemote $$$ view4强制转换为HelloWorldRemote
这可能是因为我在两个不同的耳朵中有两个接口“ Interface2”吗? 但是为什么用遥控器不会出现错误?
对于本地调用,使用@Local调用而不是@Remote是有用的吗? 我读过几件事,更好的是: https://coderanch.com/t/79249/application-servers/Local-EJB-calls-separate-ear
但我仍然有一些困惑。 请在答案中提供官方文档的文档链接。
答案 0 :(得分:1)
有关说明,请参见EJB 3.x规范,例如EJB 3.2规范第3.2.2节:
仅通过本地客户端视图访问企业bean 打包在同一客户端中的本地客户端需要支持 应用程序作为提供本地客户端的企业bean 视图。本规范的兼容实现可以选择 支持从以下位置访问企业Bean的本地客户端视图 本地客户端打包在另一个应用程序中。配置 应用程序间访问本地客户端视图的要求是 供应商特定的,不在本规范范围之内。 应用程序依赖于对本地客户端的应用程序间访问 视图是不可移植的。
使用远程接口通常将需要对方法参数和返回对象进行编组和解组,以及明确的类加载器分隔。
如果需要从另一个JVM(例如,远程客户端)或同一应用程序服务器内的另一个应用程序范围进行访问,请使用远程EJB。如果只想在应用程序范围内提供对EJB的访问,请使用本地EJB。