将一个valuetype添加到IDL,编译并失败并显示“No factory found”

时间:2010-05-27 19:49:55

标签: java corba idl

我无法弄清楚为什么客户一直在抱怨找不到工厂方法。我已经尝试过使用和不使用“factory”关键字的IDL并且没有改变行为。 SDMGeoVT IDL匹配使用的其他对象(成功运行)。

生成的SDMGeoVT类与继承和方法匹配其他生成的类。

IDL如下; idlj编译器运行w / o错误。我在服务器上实现了这个功能,我看到服务器代码运行并通过线路序列化对象(服务器代码运行正常)。

客户端使用以下堆栈跟踪进行炸弹(前几行来自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选项。

编辑:(jun 10)将其缩小为原始构建者创建的过于复杂的框架(维护程序员,是的!)在“超级”中有一个需要完成的调用。

1 个答案:

答案 0 :(得分:0)

也许你需要为pl.SDMGeoVT值类型定义一个值工厂,并用ORB注册一个工厂实例。

JacorB具有专有(非便携)功能,可让您避免为您的valuetype创建值工厂。如果您的值类型SDMGeoVT的实现被称为SDMGeoVTImpl,并且您在“pl”包中声明它并且如果它具有无参数构造函数,那么您将不需要值工厂。

有关上述两个选项的详细信息,请参阅JacORB发行版docs目录中的PDF文件。