我目前正在升级我们的业务javaee环境。应实现一项新功能,该功能允许管理Web框架中影响同一服务器上其他Web应用程序的维护通知。应使用EJB传递通知(框架将它们发送到应用程序或应用程序请求它们)。
我尝试基于接口实现它。接口用于方法签名,并且这些接口的conctret实现仅由webframework或应用程序知道。 但是所有调用都会因ClassNotFoundException(当framwork向应用程序发送通知时)或ClassCastException(当应用程序请求新的维护时)而失败。
问题:使用接口实现这个是不可能的?我是否总是需要双方的混凝土实施?前面的EJB查找确实可以使用接口(@Remote注释),所以为什么我有这些例外?
提前致谢!
我将简要介绍一下我的课程,以便您了解我正在做的事情:
当 RemoteMaintenanceEJBImpl 向 ApplicationEJBImpl 发送 MaintenanceInfoImpl 时,将使用以下方法:
public interface IApplicationImpl {
public void announceMaintenance(IMaintenanceInfo maintenanceInfo);
}
调用
remoteApplication.announceMaintenance(new MaintenanceInfoImpl(date/*, ...*/))
在应用程序端遇到 ClassNotFoundException ,因为它试图找到仅在webframework端可用的 MaintenanceInfoImpl 。
引起:java.lang.ClassNotFoundException:来自[Module“deployment.CommonDBFrontend.war:main”from Service Module Loader]的package.webapp.wf.framework.MaintenanceInfoImpl 在org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) 在org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) 在org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) 在org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) 在org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 在org.jboss.marshalling.cloner.ClassLoaderClassCloner.clone(ClassLoaderClassCloner.java:49) 在org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:157) 在org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) 在org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:186) 在org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) 在org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:267)
这又引发了这个异常(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.IMaintenanceInfo at package.webapp.ejb.impl.ApplicationEJBImpl.announceMaintenance(ApplicationEJBImpl.java:187) at package.webapp.ejb.impl.ApplicationEJBImpl.initialize(ApplicationEJBImpl.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[rt.jar:1.7.0_11] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)[rt.jar:1.7.0_11] at 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] ...
答案 0 :(得分:0)
为类MaintenanceInfoImpl实现java.io.Serializable 并确保为此设置serialVersionUID。