Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 282
dolbysurnd Avatar asked Oct 24 '11 20:10

dolbysurnd


2 Answers

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

like image 128
dolbysurnd Avatar answered Oct 17 '22 10:10

dolbysurnd


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> 
like image 44
Petru Gardea Avatar answered Oct 17 '22 12:10

Petru Gardea