【发布时间】:2011-10-18 16:22:48
【问题描述】:
我在使用 JBoss AS 7 和我的使用 EJB3.1 的应用程序时遇到了奇怪的行为。 我成功查找了 bean,但是当我尝试将其强制转换为它的接口时,抛出异常。
简述代码:
@Local
public interface BusinessObjectsFactory { ... }
@Stateless
@Local(BusinessObjectsFactory.class)
public class JPABusinessObjectsFactory implements BusinessObjectsFactory { ... }
...
Object obj = ctx.lookup("java:app/moduleName/" +
"JPABusinessObjectsFactory!pckg.BusinessObjectsFactory");
Class c = obj.getClass();
System.out.println(c.getName()); // pckg.BusinessObjectsFactory$$$view36
System.out.println(c.getInterfaces()[0].getName()); // BusinessObjectsFactory
BusinessObjectsFactory bof = (BusinessObjectsFactory) obj; //cast exception
有什么想法吗?请注意,需要接口(查找的实现是从配置文件中读取的,并且可能会更改)
【问题讨论】:
-
1.您的应用程序在服务器上执行,客户端在哪里?在同一台服务器上,在同一应用程序中? 2. 你使用的是 EJB-jar 模块还是 WAR 封装? 3.(次要)如果您在界面上指定\@Local,则无需在类级别再次执行此操作。一个 \@Local 就足够了。
-
客户端和目标 EJB 是否位于不同的 WAR 中? c.getInterfaces()[0].getClassLoader() 和 BusinessObjectsFactory.class.getClassLoader() 返回什么?
-
嗯,我在打包此类档案方面有点新意。我想要的是单独的 EJB 模块(可以说用于持久性的 EJB 模块和具有使用此持久性模块的业务逻辑的 EJB 模块)。应用程序逻辑应该通过一些接口调用持久性模块。这就是我创建这个结构的原因:
-
interfaces-jar包含BusinessObjectsFactory接口,jpa-persistence.jar知道并实现interfaces.jar,applogic.jar 知道 interfaces.jar 并进行 JNDI 查找 java:app/JPABusinessFactory
-
我正在通过 maven 构建应用程序。如果有一些很好的例子如何实现这一点(如何正确设置依赖关系以及什么应该和不应该包括特定的 EJB jars)......