如何在wsimport中映射未知的复杂类型

时间:2017-07-04 12:26:04

标签: java soap wsdl jax-ws wsimport

目前,我尝试为wsdl vis wsimport生成一个Web服务客户端,除了一种复杂类型外,它的工作方式非常好:

...
<element name="response">
 <complexType>
  <sequence>
   <element name="methodReturn" type="apachesoap:Document"/>
  </sequence>
 </complexType>
</element>
...

当我尝试通过wsimport生成客户端时,我得到:

org.xml.sax.SAXParseException; systemId: file:/D:/dev/src/java/prj/src/wsdl/service.wsdl; lineNumber: 21; columnNumber: 80; undefined simple or complex type 'apachesoap:Document'
    at com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:180)
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:175)
    at com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:110)
    at com.sun.xml.xsom.impl.parser.DelayedRef.run(DelayedRef.java:85)
    at com.sun.xml.xsom.impl.parser.ParserContext.getResult(ParserContext.java:135)
    at com.sun.xml.xsom.parser.XSOMParser.getResult(XSOMParser.java:211)
    at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:538)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:269)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:95)
    at com.sun.tools.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:142)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2298)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:198)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:141)
    at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:444)
    at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:205)
    at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:183)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.mojo.jaxws.Invoker.main(Invoker.java:78)
undefined simple or complex type 'apachesoap:Document'
  line 21 of file:/D:/dev/src/java/prj/src/wsdl/service.wsdl

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.mojo.jaxws.Invoker.main(Invoker.java:78)
Caused by: com.sun.tools.ws.wscompile.AbortException
    at com.sun.tools.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:144)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2298)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:198)
    at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:141)
    at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:444)
    at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:205)
    at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:183)
    ... 5 more

当我将类型更改为 <element name="methodReturn" type="xsd:anySimpleType"/>

可以生成客户端。所以这一代人只是挂在未知的复杂类型上。

所以问题:是否可以为wsimport提供自定义映射器,以便可以使用“apachesoap:Document”类型生成客户端?

1 个答案:

答案 0 :(得分:0)

在WSDL中你必须

  1. 提供apachesoap前缀
  2. 的命名空间
  3. 导入或包含该命名空间的XSD架构,其中定义了Document类型。 (在WSDL中或在WSDL中使用的任何XSD模式中)
  4. 然后将正确生成客户端。

    没有它wsimport(或任何其他工具)不知道apachesoap:Document实际上意味着什么类型。