dolbysurnd
dolbysurnd

Reputation: 736

JAXB Customizations With a Poorly Formed WSDL

This is driving me insane. I have a schema embedded within a WSDL that needs customization because WSIMPORT is throwing the following error

[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

1) I have no control over this WSDL as I am building a WSDL first client and I expect it to go over revisions w/o any formal consultation or release to me. 2) It is not acceptable any longer to manually fix this naming collision because I need to include the construction of stubs into an automated build chain.

I must use an external customization file. I just can't seem to figure out how to get the customization to work.

Here is the offending WSDL fragment:

<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>

This would be a great chance for you to flex your JAXB skills. Any help would be greatly appreciated.

I've been staring at the jaxb documentation for hours and still no luck. I can offer the entire WSDL if need be. Can anyone help?

Upvotes: 13

Views: 20243

Answers (2)

dolbysurnd
dolbysurnd

Reputation: 736

Well this morning I came in to work and was able to figure this out. Sometimes just walking away from the problem and coming back with a fresh head is the best way. Here is the solution that worked for me:

<?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>

I use the above external binding file with the wsimport tool in the following command.

Important things about this binding file:

  • The namespace for jaxws bindings is used. This is the only way I could get the node selection to work properly
  • The node selection has to end with /xs:complexType. If you stop at selecting the the element name the compiler will generate errors.

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

Options used:
-d generated specifies the output directory (a folder named 'generated' in this case)
-b ArtesiaExternalBinding.xml tells the JAXB compiler to use the binding file.
-keep keep the stubs (i just use the stubs for inspection)

finally, I found this to be the most helpful tidbit of information: java.net documents on jaxws customizations

This is what lead me to nesting the jaxb customizations within jaxws tags. Thanks for the link Petru Gardea

Upvotes: 19

Petru Gardea
Petru Gardea

Reputation: 21638

It is not clear what you've tried or not, but I would do the following: - make use of the -b option in the wsimport command line (doc available here). - information on binding files can be found here; - An in depth view with examples on how to customize to avoid name collisions is here. I am providing an excerpt here - it should fix your problem.

<jxb:schemaBindings>
      <jxb:package name="primer.myPo">
         <jxb:javadoc>
   <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]>
         </jxb:javadoc>
      </jxb:package>
      <jxb:nameXmlTransform>
          <jxb:elementName suffix="Element"/>
      </jxb:nameXmlTransform> 
</jxb:schemaBindings> 

Upvotes: 3

Related Questions