axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bo Xie" <mrbo...@gmail.com>
Subject Re: [axis2] WSDL2JAVA with XMLBean binding does not create instance of the derived type
Date Thu, 04 Jan 2007 06:50:54 GMT
Hi Ajith,

   The Address class only has getter and setter for name, city etc. No
getAddress. Do you see this ignoring of xsi:type in creating instance as a
bug?

   Besides using choice option as Ramesh suggested, do we run out of luck
here? I am a little hesitate to use choice as in my case, the choice list
changes quite fast. Keeping track of the exhaustive list of all the choices
is a challenge.

Thanks,
-Bo

On 1/3/07, Ajith Ranabahu <ajith.ranabahu@gmail.com> wrote:
>
> Hi,
> It seems to me that you have to go one level deep. See whether there
> is a getAddress method in the Address class.
> XMLBeans generates a lot of classes and things are a bit confusing
> specially when types and elements have similar names. AFAIK XMLBeans
> generates a class per type and element. So there would be a class
> generated for the address type and also for the address element. My
> guess is you have to check the address type object instead of the
> address element object.
>
> Ajith
>
> On 1/3/07, Bo Xie <mrboxie@gmail.com> wrote:
> > Thanks Ajith. Could you be more specific on how to figure out the right
> type
> > of the instance? Here is the code snippet and the output on the service
> > side.
> > The getAddressArray indeed returns Address[] which is good. But the
> > instanceof always returns Address even for USAddress instance. The
> > interesting thing is the toString output of the addr variable. It
> includes
> > the correct xsi-type for each instance. So how can I do the correct
> > instanceof to figure the right type to cast in this case?
> >
> > Thanks,
> > -Bo
> >
> > ----Code snippet----
> > public  void
> > updateAddresses(
> samples.quickstart.service.xmlbeans.xsd.UpdateAddressesDocument
> > param3)
> >     {
> >         //Todo fill this with the necessary business logic
> >         String symbol = param3.getUpdateAddresses().getSymbol();
> >         System.err.println(getCurrentTime()+"- Update Symbol:" +
> symbol);
> >
> >         Address[] addrs = param3.getUpdateAddresses().getAddressesArray();
> >         for (int i = 0; i < addrs.length; i++) {
> >             Address addr = addrs[i];
> >             if(addr instanceof USAddress) System.err.println("USAddress
> > instance");
> >             if(addr instanceof Address) System.err.println("Address
> > instance");
> >             System.err.println(addr.getClass().getName()+":"+addr);
> >         }
> >    ...}
> >
> >  ----Output from the code ----
> > Address instance
> > samples.quickstart.service.xmlbeans.xsd.impl.AddressImpl:
> > <xml-fragment xsi:type="xsd:US-Address"
> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > xmlns:xsd=" http://quickstart.samples/xsd"
> > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
> >   <name xmlns=" http://quickstart.samples/xsd">company name</name>
> >   <city xmlns="http://quickstart.samples/xsd">Sunnyvale</city>
> >   <state xmlns=" http://quickstart.samples/xsd">CA</state>
> >   <zip xmlns="http://quickstart.samples/xsd">94087</zip>
> > </xml-fragment>
> >
> > Address instance
> > samples.quickstart.service.xmlbeans.xsd.impl.AddressImpl:<xml-fragment
> > xsi:type="xsd:Address" xmlns:xsi="
> > http://www.w3.org/2001/XMLSchema-instance"
> > xmlns:ns1="http://quickstart.samples/xsd"
> > xmlns:xsd="http://quickstart.samples/xsd "
> > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
> >   <name xmlns="http://quickstart.samples/xsd ">company</name>
> >   <city xmlns="http://quickstart.samples/xsd">Hong Kong</city>
> > </xml-fragment>
> >
> >
> >  On 1/3/07, Ajith Ranabahu <ajith.ranabahu@gmail.com> wrote:
> > > Hi,
> > > Since the xsi:type attribute is present and points to the USAddress,
> > > the generated object should be of  type USAddress. Perhaps the problem
> > > is the way you check the instanceof. I mean XMLBeans should have
> > > generated a getAddresses method to updateAddress ? (It's a little bit
> > > weird how XMLBeans treats these schemas but I'm guessing)
> > > If you can use a debugger and go through the object hierarchy at
> > > runtime you should be able to figure this out
> > >
> > > Ajith
> > >
> > > On 1/3/07, Bo Xie <boxie@cisco.com> wrote:
> > > > Thanks Ajith for the quick response.
> > > >
> > > > I have tried to use the instanceof to test if the instance is
> USAddress,
> > > > but the test returns false. Without that, the type cast is not safe
> as
> > > > the Address list can have items of either Address or USAddress. My
> > > > question here is should the java instance created from XML be of
> type
> > > > USAddress even though the signature is Address. Is there anyway to
> make
> > > > this happen?
> > > >
> > > > Thanks,
> > > > -Bo
> > > > Ajith Ranabahu wrote:
> > > > > Hi,
> > > > > The reason here is that you have set the type of the addresses
> element
> > > > > to be 'Address' rather than USAddress (the code generator would
> put
> > > > > the reference for the Address rather than the USAddress). However
> > > > > since the xsi:type attribute is present the deserializer should
> create
> > > > > the right object and you can just use a type cast to get to the
> right
> > > > > object.
> > > > >
> > > > > HTH
> > > > >
> > > > > Ajith
> > > > >
> > > > > On 1/2/07, Bo Xie < mrboxie@gmail.com> wrote:
> > > > >> Hi there,
> > > > >>
> > > > >>   I am new to axis2 with XMLBean data binding, please help me
> with
> > the
> > > > >> following issue.
> > > > >>
> > > > >>   I modified the quickstart sample XMLBean program to try a WSDL
> with
> > > > >> the
> > > > >> following types. The type US-Address is a derived from type
> Address.
> > > > >> I would
> > > > >> like to create a service operation updateAddresses to change
> > > > >> addresses of a
> > > > >> company based on a symbol. The addresses is an array that can
> take
> > > > >> either
> > > > >> Address or USAddress instances.
> > > > >>
> > > > >>           <xs:complexType name="Address">
> > > > >>                 <xs:sequence>
> > > > >>                     <xs:element name="name" type="xs:string"
> > > > >> minOccurs="0"/>
> > > > >>                      <xs:element name="street"
> > type="xs:string"/>
> > > > >>                     <xs:element name="city" type="xs:string"/>
> > > > >>                 </xs:sequence>
> > > > >>             </xs:complexType>
> > > > >>
> > > > >>
> > > > >>             <xs:complexType name="US-Address">
> > > > >>                 <xs:complexContent>
> > > > >>                     <xs:extension base="ipo:Address">
> > > > >>                         <xs:sequence>
> > > > >>                             <xs:element name="state"
> > > > >> type="ipo:US-State"/>
> > > > >>                             <xs:element name="zip"
> > > > >> type="xs:positiveInteger"/>
> > > > >>                         </xs:sequence>
> > > > >>                     </xs:extension>
> > > > >>                 </xs:complexContent>
> > > > >>             </xs:complexType>
> > > > >>
> > > > >>          <xs:element name="updateAddresses">
> > > > >>                 <xs:complexType>
> > > > >>                     <xs:sequence>
> > > > >>                         <xs:element name="symbol"
> type="xs:string"
> > > > >> nillable="true"/>
> > > > >>                         <xs:element name="addresses"
> > type="ipo:Address"
> > > > >> maxOccurs="unbounded"/>
> > > > >>                     </xs:sequence>
> > > > >>                 </xs:complexType>
> > > > >>
> > > > >>       I used WSDL2JAVA with XMLBean data binding to generate
the
> > > > >> skeleton
> > > > >> and stub code. All looks great and the SOAP exchange looks fine
> too.
> > > > >>
> > > > >>       In the client code, I created one instance if USAddress
and
> one
> > > > >> instance of Address and put them into the addresses list. In
the
> SOAP
> > > > >> request message, the instances are as  shown as follows below.
> Note,
> > > > >> xsi-type for the instance indicate the correct types which is
> nice.
> > > > >>  <soapenv:Body>
> > > > >>  <updateAddresses xmlns=" http://quickstart.samples/xsd">
> > > > >>
> > > > >>  <symbol>XYZ</symbol>
> > > > >>  <addresses
> > > > >>
> > xmlns:xsi="http;//www.w3.org/2001/XMLSchema-instance"
> > > > >> xmlns:xsd="
> > > > >> http://quickstart.samples/xsd" xsi:type="xsd:US-Address">
> > > > >>  <name>company name</name>
> > > > >>  <city>Sunnyvale</city>
> > > > >>  <state>CA</state>
> > > > >>
> > > > >>  <zip>94087</zip>
> > > > >>  </addresses>
> > > > >>  <addresses
> > > > >>
> > xmlns:xsi="http;//www.w3.org/2001/XMLSchema-instance"
> > > > >> xmlns:xsd="http://quickstart.samples/xsd
> > > > >> " xsi:type="xsd:Address">
> > > > >>  <name>company name</name>
> > > > >>  <city>Hong Kong</city>
> > > > >>  </addresses>
> > > > >>  </updateAddresses>
> > > > >>  </soapenv:Body>
> > > > >>
> > > > >>
> > > > >>    The problem is when the XML object mapped into java object
on
> the
> > > > >> service
> > > > >> side, all the XML address object passed to the skeleton are all
> of
> > > > >> Address
> > > > >> type. I would expect one instance be Address type, another be
> > USAddress
> > > > >> type. Since xsi-type in the SOAP message has the right type,
why
> the
> > > > >> XMLBean
> > > > >> object is not created as the derived type? Is there any option
in
> > > > >> WSDL2JAVA
> > > > >> to make this work?
> > > > >>
> > > > >>    From the XMLBean Address java object, how can I access the
> > xsi-type
> > > > >> attribute that was available in the XML string?
> > > > >>
> > > > >>    If I am not heading the right direction, can anyone suggest
> some
> > > > >> alternatives?
> > > > >>
> > > > >>  Thanks for your time!
> > > > >>
> > > > >> -Bo
> > > > >>
> > > > >>
> > > > >>
> > > > >
> > > > >
> > > >
> > > >
> > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail:
> > axis-user-unsubscribe@ws.apache.org
> > > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > > >
> > > >
> > >
> > >
> > > --
> > > Ajith Ranabahu
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail:
> > axis-user-unsubscribe@ws.apache.org
> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >
> > >
> >
> >
>
>
> --
> Ajith Ranabahu
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

Mime
View raw message