1

ファクトリ メソッドが見つからないことについてクライアントが不平を言い続ける理由がわかりません。「factory」キーワードを使用して、または使用せずに IDL を試しましたが、動作は変わりませんでした。SDMGeoVT IDL は、使用される (正常に実行される) 他のオブジェクトと一致します。

生成された SDMGeoVT クラスは、継承とメソッドに関して、他の生成されたクラスと一致します。

IDL は次のとおりです。idlj コンパイラはエラーなしで実行されます。サーバーに関数を実装すると、サーバー コードが実行され、ネットワーク経由でオブジェクトがシリアル化されます (サーバー コードは正常に実行されます)。

クライアントは次のスタック トレースで爆撃します (最初の数行は jacORB ライブラリからのものです)。

コードをコンパイルしてテストするためだけに小さなアプリを作成しました (ArrayClient & ArrayServer)。基本アプリ (jacORB デモから) は正常に動作します。

基本クラスの OFBaseVT と単一のオブジェクト (SDMGeoVT とリストの戻り値) を使用してみましたが、同じ問題が発生しました。

2010-05-27 15:37:11.813 FINE read GIOP message of size 100 from ClientGIOPConnection to 127.0.0.1:47030 (1e4853f)
2010-05-27 15:37:11.813 FINE read GIOP message of size 100 from ClientGIOPConnection to 127.0.0.1:47030 (1e4853f)
org.omg.CORBA.MARSHAL: No factory found for: IDL:pl/SDMGeoVT:1.0
    at org.jacorb.orb.CDRInputStream.read_untyped_value(CDRInputStream.java:2906)
    at org.jacorb.orb.CDRInputStream.read_typed_value(CDRInputStream.java:3082)
    at org.jacorb.orb.CDRInputStream.read_value(CDRInputStream.java:2679)
    at com.helloworld.pl.SDMGeoVTHelper.read(SDMGeoVTHelper.java:106)
    at com.helloworld.pl.SDMGeoVTListHelper.read(SDMGeoVTListHelper.java:51)
    at com.helloworld.pl._PLManagerIFStub.getSDMGeos(_PLManagerIFStub.java:28)
    at com.helloworld.ArrayClient.<init>(ArrayClient.java:40)
    at com.helloworld.ArrayClient.main(ArrayClient.java:125)

  valuetype SDMGeoVT : common::OFBaseVT{
       private string   sdmName;
       private string   zip;
       private string   atz;
       private long long primaryDeptId;
       private string   deptName;
       factory instance(in string name,in string ZIP,in string ATZ,in long long primaryDeptId,in string deptName,in string name);
       string getZIP();
       void   setZIP(in string ZIP);
       string getATZ();
       void   setATZ(in string ATZ);
       long long getPrimaryDeptId();
       void   setPrimaryDeptId(in long long primaryDeptId);
       string getDeptName();
       void   setDeptName(in string deptName);
   };
   typedef sequence<SDMGeoVT> SDMGeoVTList;

   interface PLManagerIF : PublicManagerIF {
      pl::SDMGeoVTList getSDMGeos(in framework::ITransactionHandle tHandle, in long long productionLocationId);
   };

編集: IDL を構造体と値型に変更すると機能します。以前、新しいインターフェイスを作成しましたが、同じ問題で失敗しました。

編集:はい、サーバーも更新しました。サーバーとクライアントのコードは同じコード ベースです。両方のセットを構築する ant スクリプトを挿入する必要があります。-fall および -ftie オプション。

編集: (6 月 10 日) 元のビルダーが作成した過度に複雑なフレームワークに絞り込みました (メンテナンス プログラマー、そうです!) 実行する必要がある「スーパー」の 1 つに呼び出しがあります。

4

1 に答える 1

0

おそらく、pl.SDMGeoVT 値タイプの値ファクトリーを定義し、ファクトリーのインスタンスを ORB に登録する必要があります。

JacORB には独自の (移植性のない) 機能があり、値の型の値ファクトリの作成を回避できます。値型 SDMGeoVT の実装が SDMGeoVTImpl と呼ばれ、それを「pl」パッケージで宣言し、引数のないコンストラクターがある場合、値ファクトリは必要ありません。

上記の両方のオプションの詳細については、JacORB ディストリビューションの docs ディレクトリにある PDF ファイルを参照してください。

于 2010-06-18T04:47:36.933 に答える