我需要调用一个WebService,它有一个被定义为xsd:anyType数组的参数,定义如下:
<complexType name='ArrayOfAnyType'>
<complexContent>
<restriction base='soapenc:Array'>
<attribute ref='soapenc:arrayType' wsdl:arrayType ='xsd:anyType[]'/>
</restriction>
</complexContent>
</complexType>
并且返回类型也是xsd:anyType类型,如下所示:
<message name='RunTask.runTaskInput'>
<part name='taskName' type='xsd:string'/>
<part name='args' type='ns2:ArrayOfAnyType'/>
</message>
<message name='RunTask.runTaskOutput'>
<part name='return' type='xsd:anyType'/>
</message>
WebService实际上是一个可以执行许多不同任务的服务器,其中任务可以由服务器的用户配置(并且每个任务都有自己的特定参数)。
到目前为止,我可以使用Microsoft的WSDL实用程序为此Web服务生成C#客户端代理。只要我正确地将所有参数都转换为.Net'对象'类型,就可以轻松使用生成的C#代码。
我现在需要为这个Web服务生成一个Java客户端(说实话,我只是Java的初学者)。似乎有一个名为WSDL2JAVA的实用程序,我在http://ws.apache.org/muse/docs/2.0.0/tutorial/01-install-muse.html找到了它。但如果我运行它,它会给我以下错误:
警告:[ID ='NoWSRPSchema']否 找到了WS-RP模式。 java.lang.RuntimeException:[ID = 'NotDocLiteral'] WSDL操作 'runTask'不是doc-literal,因为 它定义了一个超过的消息 SOAP Body的一个消息部分。 doc-literal消息的SOAP Body 应该包含一个根请求 元素(带有操作名称) 零个或多个子元素( 参数)。 在org.apache.muse.tools.inspector.ResourceInspector.getInputName(ResourceInspector.java:486) 在org.apache.muse.tools.inspector.ResourceInspector.createJavaMethod(ResourceInspector.java:329) 在org.apache.muse.tools.inspector.ResourceInspector.getOperations(ResourceInspector.java:570) 在org.apache.muse.tools.inspector.ResourceInspector.run(ResourceInspector.java:888) 在org.apache.muse.tools.generator.analyzer.SimpleAnalyzer.inspect(SimpleAnalyzer.java:409) 在org.apache.muse.tools.generator.analyzer.SimpleAnalyzer.analyze(SimpleAnalyzer.java:348) 在org.apache.muse.tools.generator.Wsdl2Java.run(Wsdl2Java.java:178) 在org.apache.muse.tools.generator.Wsdl2Java.main(Wsdl2Java.java:270)
严重:[ID ='CodeGenFailed']代码 生成失败,见例外 以下信息。
发现了一个例外:[ID = 'NotDocLiteral'] WSDL操作 'runTask'不是doc-literal,因为 它定义了一个超过的消息 SOAP Body的一个消息部分。 doc-literal消息的SOAP Body 应该包含一个根请求 元素(操作名称) 零个或多个子元素( 参数)。
我认为xsd:anyType在这里不受支持。
为此Web服务生成代理类的更简单方法是什么? 最好尽可能简单,就像WSDL为我创建C#代理一样。