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 != std::numeric_limits<double>::infinity() 或 !isinf(val) 或 isfinite(val)