org.omg.CORBA.MARSHAL:Valuetype 没有实现 StreamableValue 或 CustomMarshal

Posted

技术标签:

【中文标题】org.omg.CORBA.MARSHAL:Valuetype 没有实现 StreamableValue 或 CustomMarshal【英文标题】:org.omg.CORBA.MARSHAL: Valuetype does not implement StreamableValue or CustomMarshal 【发布时间】:2016-12-06 19:14:46 【问题描述】:

我正在尝试使用 Liberty 配置文件 16.0.0.3 调用远程 EJB 服务(MDM 服务)。我的查找代码如下所示。

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 服务。积极的场景工作没有任何问题。当我们用消极的场景数据测试服务时(当远程 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 Boot 1.2.4/1.4.2 Liberty 配置文件 16.0.0.3 IBM JDK 8/Sun JDK 8

【问题讨论】:

我为您的问题添加了一些基本格式,以便于阅读。请查看 Stack Overflow 的 formatting guidelines,以便下次您可以自己执行此操作。 【参考方案1】:

“org.omg.CORBA.MARSHAL”说明了一切。双方接口的定义(IDL)必须相同。如果不是,编组错误就会发生。可能您的代码没有返回异常的定义,或者定义与远程端的不同。

【讨论】:

我正在调用 MDM Infospeher 远程 EJB。相同的代码在传统的 WebSphere 应用程序服务器中运行良好。当我在 Liberty 16.0.0.3 中部署代码时出现错误。我是否缺少任何特定于服务器的jar 还是与 JDK 相关的东西?有什么方法可以调试日志记录并从远程 EJB 捕获响应对象? IDL 在这两种情况下可能不同。服务器只是使用与您不同的 IDL。很多时候只是版本差异很小,在一些较新的版本中可能会添加/删除某些参数或具有不同的类型。 IDL 被编译成 Java 代码,所以除了更改代码之外,您在服务器端不能做太多事情,这可能不是一个选项。您可以做的是使用与服务器上相同的 IDL 并为您的代码编译它们。也许你可以在服务器的某个地方找到那些“.idl”文件,搜索与你正在使用的 IDL 相同或相似的文件名。 在传统的 webSpeher 中,此 orb.idl 文件位于 JDK 中。我已指向相同的 JDK 并使用 Liberty 配置文件执行了我的代码。但仍然出现相同的错误。 但我想还有另一个针对 Liberty 的 IDL?如果 IDL 发生更改,您的代码需要从 IDL 重新编译。最好的方法是从服务器复制完全相同的文件,而不是指向 JDK 中的适当文件。它们可能略有不同。

以上是关于org.omg.CORBA.MARSHAL:Valuetype 没有实现 StreamableValue 或 CustomMarshal的主要内容,如果未能解决你的问题,请参考以下文章

“val++”与“val = val + 1”有啥区别?

数据结构

val != std::numeric_limits<double>::infinity() 或 !isinf(val) 或 isfinite(val)

相当于shell bash中的“(cond)?val_true:val_false”[重复]

Pandas Groupby 列并获得频率为 0

Python数据结构