1

私は現在、ビジネス用の javaee 環境をアップグレードしています。同じサーバー上の他の Web アプリケーションに影響を与える Web フレームワークのメンテナンス通知を管理できる新しい機能を実装する必要があります。通知は、EJB を使用して転送する必要があります (フレームワークが通知をアプリケーションに送信するか、アプリケーションが通知を要求します)。

インターフェイスに基づいて実装しようとしました。インターフェイスはメソッド シグネチャで使用され、これらのインターフェイスの conctret 実装は、それぞれアプリケーションの Web フレームワークによってのみ認識されます。ただし、すべての呼び出しは、ClassNotFoundException (フレームワークがアプリケーションに通知を送信する場合) または ClassCastException (アプリケーションが新しいメンテナンスを要求する場合) のいずれかで失敗します。

質問: インターフェイスを使用してこれを実装することは不可能ですか? 両側で常に具体的な実装が必要ですか? 上記の EJB ルックアップはインターフェイス (@Remote アノテーション) を使用して機能しますが、なぜこれらの例外があるのでしょうか?

前もって感謝します!


私のクラスの概要を簡単に説明しますので、私が行っていることについてより多くの情報を得ることができます。

  • インターフェース: IMaintenanceInfo: このインターフェースは、EJB メソッドの呼び出しに使用され、単一のメンテナンスに関する情報が含まれています。
  • インターフェース: IRemoteMaintenanceEJB: このインターフェースは、RemoteMaintenanceEJB の @Remote インターフェースです。これは、アプリケーションが新しいメンテナンスを要求するために使用されます。
  • インターフェース: IApplicationEJB: このインターフェースは、Web フレームワークからのメンテナンス通知を受信するために使用されます。@Remoteです。
  • クラス: MaintenanceInfoImpl: このクラスは IMaintenanceInfo を実装します。
  • クラス: RemoteMaintenanceEJBImpl: このクラスは IRemoteMaintenanceEJB を実装します。
  • クラス: ApplicationEJBInfo: このクラスは IApplicationEJB を実装します。

RemoteMaintenanceEJBImplがMaintenanceInfoImplApplicationEJBImplに送信する場合、次のメソッドが使用されます。

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

呼び出し

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

Webframework側でのみ利用可能なMaintenanceInfoImplを見つけようとするため、アプリケーション側でClassNotFoundExceptionで失敗します。

原因: 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) で java.lang.Class.forName0(ネイティブメソッド) で java.lang.Class.forName(未知のソース) で 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 にキャストできません package.webapp.ejb.impl.ApplicationEJBImpl.announceMaintenance(ApplicationEJBImpl.java:187) at パッケージ.webapp.ejb.impl.ApplicationEJBImpl.initialize(ApplicationEJBImpl.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) [rt.jar:1.7.0_11] at sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース) [rt.jar:1.7.0_11] at sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース) [rt.jar:1.7.0_11] at java.lang.reflect.Method.invoke(不明なソース) [rt.jar:1.7] .0_11] ...

4

1 に答える 1

0

クラスMaintenanceInfoImplにjava.io.Serializableを実装し、同じものにserialVersionUIDを設定してください。

于 2014-11-11T09:29:31.010 に答える