EJB:方法调用和接口

时间:2013-02-04 13:33:41

标签: ejb jboss7.x ejb-3.1

我目前正在升级我们的业务javaee环境。应实现一项新功能,该功能允许管理Web框架中影响同一服务器上其他Web应用程序的维护通知。应使用EJB传递通知(框架将它们发送到应用程序或应用程序请求它们)。

我尝试基于接口实现它。接口用于方法签名,并且这些接口的conctret实现仅由webframework或应用程序知道。 但是所有调用都会因ClassNotFoundException(当framwork向应用程序发送通知时)或ClassCastException(当应用程序请求新的维护时)而失败。

问题:使用接口实现这个是不可能的?我是否总是需要双方的混凝土实施?前面的EJB查找确实可以使用接口(@Remote注释),所以为什么我有这些例外?

提前致谢!


我将简要介绍一下我的课程,以便您了解我正在做的事情:

  • 界面:IMaintenanceInfo: 此接口将用于EJB方法调用,并包含有关单个维护的信息。
  • 界面:IRemoteMaintenanceEJB: 此接口是RemoteMaintenanceEJB的@Remote接口。应用程序使用它来请求新的维护。
  • 接口:IApplicationEJB: 此接口用于从Web框架接收维护通知。这是@Remote。
  • 类:MaintenanceInfoImpl: 该类实现了IMaintenanceInfo
  • 类:RemoteMaintenanceEJBImpl: 此类实现IRemoteMaintenanceEJB
  • 类:ApplicationEJBInfo: 该类实现IApplicationEJB

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]   ...

1 个答案:

答案 0 :(得分:0)

为类MaintenanceInfoImpl实现java.io.Serializable 并确保为此设置serialVersionUID。

相关问题