Я не могу понять, почему клиент продолжает жаловаться на то, что не находит фабричный метод. Я пробовал 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.
Редактировать: (10 июня) Сузил его до чрезмерно сложной структуры, созданной первоначальными строителями (программист обслуживания, да!) В одном из «супер» есть вызов, который нужно сделать.