Wsimport 不工作

Wsimport don't work

我想用 Java 编写一个 WebService 客户端,但它不起作用。

我用

"c:\Program Files (x86)\Java\jdk1.8.0_60\bin\wsimport.exe" http://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?wsdl

运行这个命令和我得到的结果一样:操作"Consulta_EDOPROC"多一个链接到正文部分。第 58 行

[ERROR] Operación "Consulta_DNPRC": hay más de una parte enlazada al cuerpo.
  línea 58 de http://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?wsdl

Exception in thread "main" com.sun.tools.internal.ws.wscompile.AbortException
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModelerBase.error(WSDLModelerBase.java:732)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.setMessagePartsBinding(WSDLModeler.java:1505)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.setMessagePartsBinding(WSDLModeler.java:1431)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.processLiteralSOAPOperation(WSDLModeler.java:767)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.processSOAPOperation(WSDLModeler.java:698)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.processPort(WSDLModeler.java:466)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.processService(WSDLModeler.java:245)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:216)
        at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:126)
        at com.sun.tools.internal.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:429)
        at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:190)
        at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:168)
        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:497)
        at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:159)
        at com.sun.tools.internal.ws.WsImport.main(WsImport.java:42)

无论名为 "Body" 的部分在哪里,wsdl 都存在问题,例如

<wsdl:message name="Consulta_DNPRCHttpGetOut">
<wsdl:part name="Body"/>
</wsdl:message>

甚至在警告消息中也看到了

[WARNING] warning: part Body is ignored, either the "element" or the "type" attribute is required in part "Body"
  line 125 of http://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?wsdl

问题是缺少的那部分应该有元素或类型属性。更正它,您可以获得通过 wsimport 生成的相应 java 个对象。

我也遇到了同样的问题,我是这样解决的:

  1. 我已经创建了一个 Maven 项目。
  2. 在 pom.xml 中,我添加了“org.codehaus.mojo:jaxws-maven-plugin”插件。
  3. 我在src/main/binding/binding.xml
  4. 中创建了一个绑定文件
  5. 我已经使用服务器的证书路径创建了一个信任库文件 https://ovc.catastro.meh.es/

pom.xml中的插件部分:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <sourceDestDir>${project.build.sourceDirectory}</sourceDestDir>
        <bindingDirectory>${project.basedir}/src/main/bindings</bindingDirectory>
        <extension>true</extension>
        <genWsdl>false</genWsdl>           
        <xdisableSSLHostnameVerification>false</xdisableSSLHostnameVerification>
        <keep>true</keep>
        <protocol>soap1.1</protocol>
        <verbose>true</verbose>
        <xnocompile>true</xnocompile>
        <xdebug>true</xdebug>
    </configuration>
    <executions>
        <execution>
          <goals>
              <goal>wsimport</goal>
          </goals>
          <configuration>
              <vmArgs>
                  <vmArg>-Djavax.net.ssl.trustStore=${project.basedir}/src/main/ssl/catastro.jks</vmArg>
                 <vmArg>-Djavax.net.ssl.trustStorePassword=changeit</vmArg>
             </vmArgs>
             <wsdlUrls>
                 <wsdlUrl>https://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?WSDL</wsdlUrl>
             </wsdlUrls>
         </configuration>
        </execution>
    </executions>
</plugin>

重要:使用<extension>true</extension>标签。

binding.xml源码:

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="1.0"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <jxb:globalBindings collectionType="java.util.ArrayList" 
        underscoreBinding="asCharInWord"
        enableJavaNamingConventions="true" generateIsSetMethod="false"
        typesafeEnumBase="xs:string" typesafeEnumMemberName="generateName">
        <jxb:serializable uid="1" />
    </jxb:globalBindings>

</jxb:bindings>

执行mvn clean install,插件生成JAXB 类:

[INFO] Processing: https://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?WSDL
[INFO] jaxws:wsimport args: [-keep, -s, '/workspace/catastro-workitem/src/main/java', -d, '/workspace/catastro-workitem/target/classes', -verbose, -encoding, UTF-8, -extension, -Xnocompile, -Xdebug, -b, 'file:/workspace/catastro-workitem/src/main/bindings/binding.xml', "https://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?WSDL"]

parsing WSDL...
.../...
.../...
Generating code...

es/meh/catastro/Callejero.java
es/meh/catastro/Consulta_DNP.java
es/meh/catastro/Consulta_DNPPP.java
es/meh/catastro/Municipios.java
es/meh/catastro/ObjectFactory.java
es/meh/catastro/Provincias.java
es/meh/catastro/package-info.java
org/tempuri/ovcservweb/ovccallejero/CallejeroX0020DeX0020LaX0020SedeX0020ElectrónicaX0020DelX0020Catastro.java
org/tempuri/ovcservweb/ovccallejero/CallejeroX0020DeX0020LaX0020SedeX0020ElectrónicaX0020DelX0020CatastroHttpGet.java
org/tempuri/ovcservweb/ovccallejero/CallejeroX0020DeX0020LaX0020SedeX0020ElectrónicaX0020DelX0020CatastroHttpPost.java
org/tempuri/ovcservweb/ovccallejero/CallejeroX0020DeX0020LaX0020SedeX0020ElectrónicaX0020DelX0020CatastroSoap.java
org/tempuri/ovcservweb/ovccallejero/package-info.java