我目前正在升级我们的业务 javaee 环境。应该实现一个新功能,它允许管理影响同一服务器上其他 Web 应用程序的 Web 框架中的维护通知。通知应该使用 EJB 传输(框架将它们发送到应用程序或应用程序请求它们)。
我试图基于接口来实现它。这些接口用于方法签名中,并且这些接口的具体实现仅由 web 框架和应用程序知道。但是所有调用都失败并出现 ClassNotFoundException(当框架向应用程序发送通知时)或 ClassCastException(当应用程序要求新的维护时)。
问题:使用接口实现这一点是不可能的吗?我总是需要双方的具体实现吗?前面的 EJB 查找确实使用接口(@Remote 注释)工作,那么为什么会有这些异常呢?
提前致谢!
我将为您简要介绍我的课程,以便您了解有关我在做什么的更多信息:
- 接口:IMaintenanceInfo: 该接口将用于 EJB 方法调用,并包含有关单个维护的信息。
- 接口:IRemoteMaintenanceEJB: 此接口是RemoteMaintenanceEJB 的@Remote 接口。应用程序使用它来请求新的维护。
- 接口:IApplicationEJB: 该接口用于接收来自网络框架的维护通知。它是@Remote。
- 类:MaintenanceInfoImpl: 此类实现 IMaintenanceInfo
- 类:RemoteMaintenanceEJBImpl: 此类实现 IRemoteMaintenanceEJB
- 类:ApplicationEJBInfo: 此类实现 IApplicationEJB
当RemoteMaintenanceEJBImpl将MaintenanceInfoImpl发送到ApplicationEJBImpl时,将使用以下方法:
public interface IApplicationImpl {
public void announceMaintenance(IMaintenanceInfo maintenanceInfo);
}
调用
remoteApplication.announceMaintenance(new MaintenanceInfoImpl(date/*, ...*/))
在应用程序端失败并出现ClassNotFoundException,因为它试图找到仅在 webframework 端可用的MaintenanceInfoImpl 。
引起:java.lang.ClassNotFoundException: package.webapp.wf.framework.MaintenanceInfoImpl from [Module "deployment.CommonDBFrontend.war:main" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java: 190) 在 org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) 在 org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java) 的 org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) :398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at org.jboss.marshalling .cloner.ClassLoaderClassCloner.clone(ClassLoaderClassCloner.java:49) 在 org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:157) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner. java:186) 在 org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:267) 的 org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134)
这再次引发了这个异常(JBoss AS 7.1.2)
java.lang.RuntimeException:JBAS014154:编组 EJB 参数失败
当ApplicationEJBImpl向RemoteMaintenanceEJBImpl请求新的维护时,将使用以下方法:
public interface IRemoteMaintenanceEJB {
pubilc List<IMaintenanceInfo> getMaintenances();
}
调用失败并出现异常
原因:java.lang.ClassCastException:package.webapp.wf.framework.MaintenanceInfoImpl 无法在 package.webapp.ejb.impl.ApplicationEJBImpl.announceMaintenance(ApplicationEJBImpl.java:187) 处的 package.webapp.ejb.IMaintenanceInfo 中转换为 package.webapp.ejb.IMaintenanceInfo .webapp.ejb.impl.ApplicationEJBImpl.initialize(ApplicationEJBImpl.java:96) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_11] 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_11] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_11] at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7 .0_11] ...