Hi,
I have a service that returns a wsdl:message with multiple parts:
+++++++++++++++++++++++++
<wsdl:message name="getPortfolioNameRequest">
<wsdl:part name="clientInfo" type="skream:WSClientInfo"/>
<wsdl:part name="positionDate" type="xsd:date"/>
<wsdl:part name="portfolio" type="skream:WSPortfolio"/>
</wsdl:message>
<wsdl:message name="getPortfolioNameResponse">
<wsdl:part name="serverInfo" type="skream:WSServerInfo"/>
<wsdl:part name="description" type="xsd:string"/>
</wsdl:message>
+++++++++++++++++++++++++
The wsdl2Java generates the following interface:
+++++++++++++++++++++++++
public void getPortfolioName(WSClientInfo clientInfo, Date positionDate,
WSPortfolio portfolio, WSServerInfoHolder serverInfo, StringHolder description)
throws java.rmi.RemoteException;
+++++++++++++++++++++++++
The return type of the function is void. When axis client receives the
"getPortfolioNameResponse" message it fails to find a correct de-serializer for
type void. Here is the exception stack:
+++++++++++++++++++++++++
org.xml.sax.SAXException: Deserializing parameter 'serverInfo': could not find
deserializer for type {http://xml.apache.org/axis/}Void
at org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:302)
at
org.apache.axis.encoding.DeserializationContextImpl.startElement(DeserializationContextImpl.java:949)
at
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:198)
at
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:718)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:232)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:346)
at org.apache.axis.client.Call.invoke(Call.java:2234)
at org.apache.axis.client.Call.invoke(Call.java:2133)
at org.apache.axis.client.Call.invoke(Call.java:1656)
at
com.putnaminv.skream.ws.WSCalcEngineServiceSoapBindingStub.getPortfolioName(WSCalcEngineServiceSoapBindingStub.java:425)
at
com.putnaminv.skream.ws.WSCalcEngineServiceTestCase.test4WSCalcEngineServiceGetPortfolioName(WSCalcEngineServiceTestCase.java:140)
at java.lang.reflect.Method.invoke(Native Method)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at junit.textui.TestRunner.doRun(TestRunner.java:116)
at junit.textui.TestRunner.doRun(TestRunner.java:109)
at junit.textui.TestRunner.run(TestRunner.java:72)
at
com.putnaminv.skream.ws.WSCalcEngineServiceTestCase.main(WSCalcEngineServiceTestCase.java:26)
+++++++++++++++++++++++++
However, declaring the return message to be empty ...
+++++++++++++++++++++++++
<wsdl:message name="getPortfolioNameResponse"/>
+++++++++++++++++++++++++
... generates a function without OUT parameters
+++++++++++++++++++++++++
public void getPortfolioName(WSClientInfo clientInfo, Date positionDate,
WSPortfolio portfolio) throws java.rmi.RemoteException;
+++++++++++++++++++++++++
... which the client uses without any serialization problems.
I should mention that the server is a C++ implementation generated with
the RogueWave SoapWorx engine, and the C++ client it generates does
not have any problems digesting multiple OUT params.
Has anyone tried to implement a service with multiple INOUT/OUT parameters?
What are the possible workarounds here?
Thank,
--dmitry
=====
"Smith-n-Wesson--the original point-and-click interface"