java - 将 valuetype 添加到 IDL,编译失败并显示 "No factory found"

标签 java corba idl

我不明白为什么客户一直提示找不到工厂方法。我尝试过带或不带“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 日)将其范围缩小到原始构建者创建的过于复杂的框架(维护程序员,是的!)需要完成其中一个“ super ”调用。

最佳答案

也许您需要为 pl.SDMGeoVT valuetype 定义一个值工厂,并使用 ORB 注册该工厂的实例。

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

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

关于java - 将 valuetype 添加到 IDL,编译失败并显示 "No factory found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924385/

相关文章:

java - Android中获取函数值

java - 如何将某个值与数组中的值进行比较?

java - 从 Excel 使用 EJB 的最佳解决方案

java - 使用CORBA在Java中的ObjectList中添加元素

c++ - IDL 文件 - 静态链接或动态链接

java - 使用spring存储过程调用oracle存储过程

java - 如何在 GlassFish 上指定过滤器映射的顺序?

corba - CORBA 是遗产吗?

linux - 用于循环更改文件中变量的命令行

c++ - C++ COM(ATL)中添加新接口(interface)需要注意什么