使用格式错误的WSDL进行JAXB自定义

dol*_*rnd 12 soap wsdl web-services jaxb

这让我疯了.我在WSDL中嵌入了需要自定义的模式,因为WSIMPORT引发了以下错误

[ERROR] Complex type and its child element share the same name "DomainsMap".
Use a class customization to resolve this conflict.
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl
Run Code Online (Sandbox Code Playgroud)

1)我无法控制这个WSDL,因为我正在构建一个WSDL第一个客户端,并且我希望它能够在没有任何正式咨询或发布给我的情况下进行修订.2)手动修复此命名冲突是不可接受的,因为我需要将存根的构造包含在自动构建链中.

我必须使用外部自定义文件.我似乎无法弄清楚如何让定制工作.

这是违规的WSDL片段:

<wsdl:definitions>
    <wsdl:types>
       <xs:schema>
        .
        .
        .
       <xs:complexType final="extension restriction" name="domainsMap">
         <xs:sequence>
           <xs:element name="domainsMap">
             <xs:complexType>
               <xs:sequence>
                 <xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
                   <xs:complexType>
                     <xs:sequence>
                       <xs:element minOccurs="0" name="key" type="xs:string"/>
                        <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/>
                     </xs:sequence>
                   </xs:complexType>
                 </xs:element>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
         </xs:sequence>
       </xs:complexType>
Run Code Online (Sandbox Code Playgroud)

这将是您展示JAXB技能的绝佳机会.任何帮助将不胜感激.

我一直盯着jaxb文档几个小时但仍然没有运气.如果需要,我可以提供整个WSDL.有人可以帮忙吗?

dol*_*rnd 19

好吧,今天早上我进来工作,并能够解决这个问题.有时只是远离问题并以新头回来是最好的方法.这是适合我的解决方案:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  wsdlLocation="ArtesiaWebServices.wsdl">

    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType">
        <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! -->
        <jaxb:class name="DomainsMapElement"/>
    </jaxws:bindings>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType">
        <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! -->
        <jaxb:class name="DomainValueMapElement"/>
    </jaxws:bindings>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)

我在以下命令中使用上述外部绑定文件和wsimport工具.

关于此绑定文件的重要事项:

  • 使用jaxws绑定的命名空间.这是我可以让节点选择正常工作的唯一方法
  • 节点选择必须以/ xs:complexType结尾.如果停止选择元素名称,编译器将生成错误.

    wsimport -d generated -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

使用的选项:
-d generated指定输出目录(在这种情况下名为'generated'的文件夹)
-b ArtesiaExternalBinding.xml告诉JAXB编译器使用绑定文件.
-keep保留存根(我只是使用存根进行检查)

最后,我发现这是最有用的信息: 关于jaxws自定义的java.net文档

这就是我在jaxws标签中嵌套jaxb自定义的原因.感谢Petru Gardea的链接