2013-02-04 40 views
1

我目前正在升級我們的企業javaee環境。應該實施一項新功能,該功能允許管理影響同一臺服務器上其他Web應用程序的Web框架中的維護通知。應該使用EJB傳輸通知(框架將它們發送給應用程序或應用程序請求它們)。EJB:方法調用和接口

我試圖根據接口來實現它。這些接口用於方法簽名中,並且這些接口的通用實現僅由網絡框架和應用程序知道。 但是,所有的調用失敗都會導致ClassNotFoundException(當框架嚮應用程序發送通知時)或ClassCastException(應用程序請求新的維護時)。

問題:使用接口不可能實現這個嗎?我是否總是需要雙方的混合實現?前面的EJB查找確實可以使用接口(@Remote註釋),那麼爲什麼我會有這些異常呢?

在此先感謝!


我會給你在我班一個簡短的概述,讓你有更多的信息我在做什麼:

  • 接口:IMaintenanceInfo: 此接口將被用於EJB方法調用幷包含有關單個維護的信息。
  • 接口:IRemoteMaintenanceEJB: 此接口是RemoteMaintenanceEJB的@Remote接口。這被應用程序用來請求新的維護。
  • 接口:IApplicationEJB: 此接口用於接收來自網絡框架的維護通知。它是@Remote。
  • 類別:MaintenanceInfoImpl: 此類實現IMaintenanceInfo
  • 類別:RemoteMaintenanceEJBImpl: 此類實現IRemoteMaintenanceEJB
  • 類別:ApplicationEJBInfo: 此類實現IApplicationEJB

RemoteMaintenanceEJBImpl發送MaintenanceInfoImplApplicationEJBImpl,下面的方法將被使用:

public interface IApplicationImpl { 
    public void announceMaintenance(IMaintenanceInfo maintenanceInfo); 
} 

調用

remoteApplication.announceMaintenance(new MaintenanceInfoImpl(date/*, ...*/)) 

Failes與ClassNotFoundException的在應用側因爲它試圖找到MaintenanceInfoImpl,它僅適用於網頁框架的一面。

產生的原因:在org.jboss.modules.ModuleClassLoader 拋出java.lang.ClassNotFoundException:package.webapp.wf.framework.MaintenanceInfoImpl從[從服務模塊加載模塊 「主deployment.CommonDBFrontend.war」] .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) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) 在java.lang.Class.forName0(本地方法) at java.lang.Class.forName(Unknown Source) at org.jboss.marshalling.cloner.ClassLoaderClassCloner.clone(ClassLoaderClassCloner.java:49) at 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.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參數


ApplicationEJBImplRemoteMaintenanceEJBImpl對於新的維護,將使用以下方法:

public interface IRemoteMaintenanceEJB { 
    pubilc List<IMaintenanceInfo> getMaintenances(); 
} 

調用failes與例外

產生的原因:java.lang.ClassCastException:package.webapp.wf.framework.MaintenanceInfoImpl不能轉換到package.webapp.ejb.IMaintenanceInfo 在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] 在java.lang.reflect.Method.invoke(來源不明)的rt.jar:1.7.0_11] ...

回答

0

該類實現java.io.Serializable MaintenanceInfoImpl ,並且確保你將serialVersionUID設置爲相同。