我无法弄清楚为什么客户总是抱怨找不到工厂方法。我试过了IDL,使用和不使用“ factory”关键字,都没有改变行为。 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更改为结构vs值类型的作品。
以前我已经创建了一个新界面,但由于相同的问题而失败了。
编辑:是也更新了服务器。服务器和客户端代码是相同的代码库。我必须放入构建两个集合的ant脚本; -fall和-ftie选项。
编辑:( 6月10日),将其范围缩小到原始构建者创建的过于复杂的框架(维护程序员,是的!),其中一个“超级”调用需要完成。
最佳答案
也许您需要为pl.SDMGeoVT值类型定义一个值工厂,并向ORB注册该工厂的实例。
JacORB具有专有(不可移植)功能,使您避免为您的valuetype创建值工厂。如果将值类型SDMGeoVT的实现称为SDMGeoVTImpl,并且在“ pl”包中声明了它,并且它具有无参数构造函数,则将不需要值工厂。
有关上述两个选项的详细信息,请参见JacORB发行版的docs目录中的PDF文件。
关于java - 将值类型添加到IDL,进行编译,但失败并显示“找不到工厂”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2924385/