Добавление типа значения в IDL, компиляция и сбой, поскольку фабрика не найдена

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


person jim    schedule 27.05.2010    source источник
comment
Ты тоже сервер обновлял? Когда вы обновляли сервер, вы запускали idlj с ключом -fall? Можете ли вы опубликовать свой файл idl и команду idlj?   -  person jle    schedule 28.05.2010
comment
(Джим, через 10 лет...) Переход с Visibroker на JacORB. (idl JacORB выдает лексическую ошибку, поэтому используется stnd java idlj). Создание TIE также. В коде нет xxxVTImpl, а абстрактный xxxVT изменен, чтобы быть созданным классом, необходимо зарегистрировать xxxVTDefaultFactory в ORB. RegisterVTFactoriesWithORB (сфера ORB, String factoryId, фабрика ValueFactory). Вызывается так: new RegisterVTFactoriesWithORB((org.omg.CORBA_2_3.ORB) orb, STMGeoVT._truncatable_ids[0], (ValueFactory)new STMGeoVTDefaultFactory()); ПРИМЕЧАНИЕ. На стороне сервера все в порядке, регистрация выполняется на стороне КЛИЕНТА.   -  person jim    schedule 31.08.2018
comment
(ПРОДОЛЖЕНИЕ) Примечание. RegisterVTFactoriesWithORB — это ваш собственный класс только для вызова метода register_value_with_factory. Следует очистить и инкапсулировать ВЕСЬ установочный код, добавленный в биты клиента. AKA 1 вызов в клиенте против многих вызовов в клиенте, регистрирующих все VT.   -  person jim    schedule 31.08.2018


Ответы (1)


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

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

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

person John Black    schedule 18.06.2010