При добавлении значения типа в IDL, скомпилируйте, и произойдет сбой с "Не найдена фабрика" - PullRequest
1 голос
/ 27 мая 2010

Я не могу понять, почему клиент продолжает жаловаться на то, что не нашел заводской метод. Я пробовал IDL с ключевым словом "factory" и без него, и это не изменило его поведение. IDL SDMGeoVT соответствует другим используемым объектам (которые успешно работают).

Сгенерированные классы 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 для структуры по сравнению с типом значения работает. Ранее я создал новый интерфейс, и это не удалось с той же проблемой.

Редактировать: Да, также обновлен сервер. Код сервера и клиента является одной и той же кодовой базой. Я должен положить в сценарий муравья, который создает оба набора; опции -fall и -ftie.

Редактировать: (10 июня) Сузили его до слишком сложной структуры, созданной первоначальными сборщиками (программист обслуживания, да!). В одном из «супервизоров» необходимо выполнить вызов.

1 Ответ

0 голосов
/ 18 июня 2010

Возможно, вам нужно определить фабрику значений для pl.SDMGeoVT valuetype и зарегистрировать экземпляр фабрики в ORB.

JacORB имеет проприетарную (непереносимую) функцию, которая позволяет избежать создания фабрики значений для вашего типа значения. Если ваша реализация типа оценки SDMGeoVT называется SDMGeoVTImpl, и вы объявляете ее в своем пакете "pl", и если он имеет конструктор без аргументов, вам не понадобится фабрика значений.

См. Файл PDF в каталоге docs дистрибутива JacORB для получения подробной информации об обоих вышеупомянутых параметрах.

...