我需要调用一个 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 'object' 类型,生成的 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 主体定义了具有多个消息部分的消息。文档文字消息的 SOAP 主体应包含一个根请求元素(带有操作名称)和零个或多个子元素(参数)。在 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:
严重:[ID = 'CodeGenFailed'] 代码生成失败,请参阅下面的异常信息。
捕获到异常:[ID = 'NotDocLiteral'] WSDL 操作“runTask”不是文档文字,因为它定义了一条消息,其中包含多个消息部分用于其 SOAP 主体。文档文字消息的 SOAP 主体应包含一个根请求元素(带有操作名称)和零个或多个子元素(参数)。
我认为这里不支持 xsd:anyType。
为该 Web 服务生成代理类的更简单方法是什么?最好尽可能简单,就像 WSDL 为我创建了 C# 代理一样。