I'm struggling with finding a working JiBX binding for the client side of an
AndroMDA-generated Web Service and Axis2.

AndroMDA generates a WSDL and the POJOs.  I want to use these server-side POJOs
also on the client side, by connecting them with JiBX to the WSDL.  For
"singular" Value Object, this works fine, but a collection gives me problems.

The details: I have three UML classes, with a 1-to-* composition relation
between AContainer and AContainee:

   @Service @WebService
   class PeeringService{
      +getContainers() : AContainer
   }

   @ValueObject
   class AContainer{
      +name : String
   }

   @ValueObject
   class AContainee{
      +id : int
   }

AndroMDA generates this WSDL:

   <wsdl:definitions ...>
       <wsdl:types>
           <xsd:schema ...>
               <xsd:element name="getContainers">
                   <xsd:complexType/>
               </xsd:element>
               <xsd:element name="getContainersResponse">
                   <xsd:complexType>
                       <xsd:sequence>
                           <xsd:element name="getContainersReturn" 
type="impl:AContainer"/>
                       </xsd:sequence>
                   </xsd:complexType>
               </xsd:element>
               <xsd:complexType name="ArrayOfAContainee">
                   <xsd:sequence>
                       <xsd:element name="aContainee" minOccurs="0" 
maxOccurs="unbounded" form="qualified" type="impl:AContainee" />
                   </xsd:sequence>
               </xsd:complexType>
               <xsd:complexType name="AContainee">
                   <xsd:all>
                       <xsd:element name="id" nillable="false" type="xsd:int"/>
                       <xsd:element name="aContainer" nillable="false" 
type="impl:AContainer"/>
                   </xsd:all>
               </xsd:complexType>
               <xsd:complexType name="AContainer">
                   <xsd:all>
                       <xsd:element name="name" nillable="false" 
type="xsd:string"/>
                       <xsd:element name="aContainees" nillable="true" 
type="impl:ArrayOfAContainee"/>
                   </xsd:all>
               </xsd:complexType>
           </xsd:schema>
       </wsdl:types>
       ...
   </wsdl:definitions>

And these POJOs:

   public class AContainer implements java.io.Serializable{
       ...
       private String name;
       public String getName(){ return this.name; }
       public void setName(String name){ this.name = name; }

       private AContainee[] aContainees;
       public AContainee[] getAContainees(){ return this.aContainees; }
       public void setAContainees(AContainee[] aContainees){ this.aContainees = 
aContainees; }
   }

   public class AContainee implements java.io.Serializable{
       ...
       private int id;
       public int getId(){ return this.id; }
       public void setId(int id){ this.id = id; }

       private AContainer aContainer;
       public AContainer getAContainer(){ return this.aContainer; }
       public void setAContainer(AContainer aContainer){ this.aContainer = 
aContainer; }
   }

I'm trying this binding.xml:

   <?xml version="1.0" encoding="UTF-8"?>
   <binding force-classes="true" xmlns:tns="http://...peering.service"; 
value-style="element">
       <namespace uri="http://...peering.service"; default="elements"/>

       <mapping abstract="true" type-name="tns:AContainee" class="AContainee" 
ordered="false">
           <value name="id" field="id" usage="optional"/>
           <value name="aContainer" field="aContainer" usage="optional"/>
       </mapping>

       <mapping abstract="true" type-name="tns:AContainer" class="AContainer" 
ordered="false">
           <value name="name" field="name" usage="optional"/>
           <collection field="aContainees" item-type="AContainee[]"/>
       </mapping>
   </binding>

The JiBX binding compiler runs fine.
Axis2's WSDL2Java runs fine, too.

My test implementation of the service gives me this response:

   <?xml version='1.0' encoding='UTF-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
     <soapenv:Body>
       <ns:getContainersResponse xmlns:ns="http://...peering.service";>
         <ns:getContainersReturn>
           <ns:AContainees>
             <ns:aContainee>
               <ns:id>4711</ns:id>
             </ns:aContainee>
             <ns:aContainee>
               <ns:id>4712</ns:id>
             </ns:aContainee>
             <ns:aContainee>
               <ns:id>4713</ns:id>
             </ns:aContainee>
             <ns:aContainee>
               <ns:id>4714</ns:id>
             </ns:aContainee>
             <ns:aContainee>
               <ns:id>4715</ns:id>
             </ns:aContainee>
           </ns:AContainees>
           <ns:name>name-of-container</ns:name>
         </ns:getContainersReturn>
       </ns:getContainersResponse>
     </soapenv:Body>
   </soapenv:Envelope>

But when I run the WSDL2Java-generated test client, it complains:

   org.apache.axis2.AxisFault: No unmarshaller for element 
"{http://..peering.service}AContainees"; (line -1, col -1, in SOAP-message)
           at org.apache.axis2.AxisFault.makeFault(AxisFault.java:381)
           at 
...peering.client.PeeringServiceStub.convertException(PeeringServiceStub.java:808)
           at 
...peering.client.PeeringServiceStub.getContainers(PeeringServiceStub.java:368)
           at ...peering.client.Main.main(Main.java:56)
   Caused by: org.jibx.runtime.JiBXException: No unmarshaller for element 
"{http://...peering.service}AContainees"; (line -1, col -1, in SOAP-message)
           at 
org.jibx.runtime.impl.UnmarshallingContext.unmarshalElement(UnmarshallingContext.java:2534)
           at ...peering.service.JiBX_MungeAdapter.JiBX_binding_unmarshal_1_0()
           at 
...peering.service.AContainer.JiBX_binding_unmarshal_1_0(AContainer.java)
           at ...peering.service.JiBX_bindingAContainer_access.unmarshal()
           at 
...peering.client.PeeringServiceStub.getContainers(PeeringServiceStub.java:352)
           ... 1 more

I then tried to deploy the TypedArrayMapper by adding this to binding.xml:

    <mapping abstract="true" 
             type-name="tns:AContainees"
             class="AContainee[]"
             marshaller="org.jibx.extras.TypedArrayMapper"
             unmarshaller="org.jibx.extras.TypedArrayMapper"/>
    
But it gives me the same runtime error.

I'm obviously missing a mapping definition, but I'm really lost here.

Besides getting this to work with a manually created binding.xml, is there a
more elegant way to even generate the binding.xml from (AndroMDA-generated)
WSDL?

Thanks!
-Max

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
jibx-users mailing list
jibx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to