2016-12-06 28 views
0

Я пытаюсь вызвать удаленный EJB-сервис (услуга MDM) с использованием профиля Liberty 16.0.0.3. Мой код поиска выглядит ниже.org.omg.CORBA.MARSHAL: Valuetype не реализует StreamableValue или CustomMarshal

ctx = new InitialContext(); 
Object obj = 
     ctx.lookup("corbaname:iiop:myhost:9810/NameServiceServerRoot#com/dwl/base/requestHandler/beans/DWLServiceController"); 
     dwlServiceControllerHome = (DWLServiceControllerHome)PortableRemoteObject.narrow(obj, DWLServiceControllerHome.class); 
     dwlServiceController = dwlServiceControllerHome.create(); 
     HashMap<String, String> contextMap = createContextMap(); 

     String response = dwlServiceController.processRequest(contextMap, wccReqString).toString().trim(); 
          try { 
           StringReader reader = new StringReader(response);     
           StreamSource streamSource = new StreamSource(reader); 
           tcrmResp = (TCRMService) providerMarshaller.unmarshal(streamSource); 
          } catch (Exception e) { 

           e.printStackTrace(); 

           throw e; 
          } 

С выше кода я могу иметь возможность удаленного вызова EJB service.Positive сценарий работает без каких-либо issue.When мы тестируем услугу с данными негативных сценариев (Когда служба удаленного EJB бросить Пользовательские допустимые исключения) получать ниже ошибки.

[ERROR ] MARSHAL "Valuetype does not implement StreamableValue or CustomMarshal", at pos=0x214 
[err] org.omg.CORBA.MARSHAL: Valuetype does not implement StreamableValue or CustomMarshal: vmcid: 0x0 minor code: 0x0 completed: No 
[err] at org.apache.yoko.orb.OB.ValueReader.unmarshalValueState(ValueReader.java:716) 
[err] at org.apache.yoko.orb.OB.ValueReader.access$300(ValueReader.java:54) 
[err] at org.apache.yoko.orb.OB.ValueReader$ClassCreationStrategy.create(ValueReader.java:196) 
[err] at [internal classes] 
[err] at java.lang.Throwable.readObject(Throwable.java:388) 
[err] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[err] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
[err] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
[err] at java.lang.reflect.Method.invoke(Method.java:508) 
[err] at org.apache.yoko.rmi.impl.ValueDescriptor.readSerializable(ValueDescriptor.java:735) 
[err] at [internal classes] 
[err] at org.apache.yoko.orb.OB.ValueReader.access$200(ValueReader.java:54) 
[err] at org.apache.yoko.orb.OB.ValueReader$ClassCreationStrategy.create(ValueReader.java:189) 
[err] at [internal classes] 
[err] at com.dwl.base.requestHandler.beans._DWLServiceController_Stub.processRequest(_DWLServiceController_Stub.java:1001) 

Мы используем ниже спецификации технологии

  • Spring Загрузочный 1.2.4/1.4.2
  • Liberty Профиль 16.0.0.3
  • IBM JDK 8/Sun JDK 8
+0

Я добавил некоторое базовое форматирование к вашему вопросу, чтобы было легче читать. Ознакомьтесь с [Правилами форматирования] Stack Overflow (https://stackoverflow.com/help/formatting), чтобы вы могли сделать это самостоятельно в следующий раз. – Chris

ответ

0

"org.omg.CORBA.MARSHAL" говорит все. Определения (IDL) интерфейсов с обеих сторон должны быть идентичными. Ошибка маршаллинга происходит точно, если это не так. Вероятно, ваш код не имеет определения для возвращаемого исключения или определения отличается от определения на удаленном сервере.

+0

Я звоню в MDM Infospeher удаленно EJB. Этот код отлично работает в традиционном сервере приложений WebSphere. Когда я разворачиваю код в Liberty 16.0.0.3, я получаю сообщение об ошибке. Мне не хватает какой-либо конкретной серверной банки или это связано с JDK? Есть ли способ, чтобы я мог отлаживать ведение журнала и захватить объект ответа из удаленного EJB? – springbootlearner

+0

IDL, вероятно, отличаются в этих двух случаях. Сервер просто использует разные IDL, чем вы. Много раз это небольшая разница версий, в некоторой новой версии некоторые параметры могут быть добавлены/удалены или имеют другой тип. – BJovke

+0

IDLs скомпилированы в Java-код, поэтому вы не можете много сделать на стороне сервера, кроме как изменить код, что, вероятно, не является вариантом. Что вы можете сделать, это использовать те же IDL, что и на сервере, и скомпилировать их для вашего кода. Возможно, вы можете найти эти файлы «.idl» где-то на сервере, искать те же или похожие имена файлов, что и IDL, которые вы используете. – BJovke