You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Vladimir Duloglo <vd...@cdrator.com> on 2010/11/11 13:00:01 UTC

[AXIS2]. axis2. xsi:type object mapping does not work

I am experiencing some problems converting XML requests on the server side, in case XML requests contain xsi:type parameter.

The setup is following

Two objects:

ObjectSubClass extends ObjectSuperClass

A webservice with a method: getObject(ObjectSuperClass obj)

In wsdl these objects defined in the following way:

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://mypackage.com/xsd">
<xs:complexType name="ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ObjectSubClass">
<xs:complexContent>
<xs:extension base="ax21:ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
>From the client I am calling this method by passing to it subclass - ObjectSubClass which has one extrafield -- phone:

ObjectSubClass obj = new ObjectSubclass();
obj.setId("some id");
obj.setName("some name");
obj.setPhone("some phone");
getObject(obj);

In the request XML object is represented like that:

<obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
<id>1</id>
<name>test</name>
<q1:phone>123</q1:phone>
</obj>
But on the server side no matter if I am passing instance of ObjectSuperClass or instance of ObjectSubClass I am getting always instance of superclass ObjectSuperClass, even when xsi:type specifies that object is of subclass ObjectSubClasstype. As a result I am not getting values present on ObjectSubClass and getting only values defined in superclass ObjectSuperClass.

Same structure worked fine in axis1 ans xsi:type was respected.

Maybe it is some configuration in axis2.

I would be really thankful for any help.



RE: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Vladimir Duloglo <vd...@cdrator.com>.
Hi, Prateek

Below is complete WSDL.


<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://mypackage" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ax21="http://mypackage/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://mypackage">
    <wsdl:documentation>TestService</wsdl:documentation>
    <wsdl:types>
        <xs:schema xmlns:ax22="http://mypackage/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mypackage">
            <xs:import namespace="http://mypackage/xsd"/>
            <xs:element name="objectSubClassAccessor">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="obj" nillable="true" type="ax22:ObjectSubClass"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="isSubClassObject">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="obj" nillable="true" type="ax22:ObjectSuperClass"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="isSubClassObjectResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" type="xs:boolean"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mypackage/xsd">
            <xs:complexType name="ObjectSuperClass">
                <xs:sequence>
                    <xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="ObjectSubClass">
                <xs:complexContent>
                    <xs:extension base="ax21:ObjectSuperClass">
                        <xs:sequence>
                            <xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
                        </xs:sequence>
                    </xs:extension>
                </xs:complexContent>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="objectSubClassAccessorRequest">
        <wsdl:part name="parameters" element="ns:objectSubClassAccessor"/>
    </wsdl:message>
    <wsdl:message name="isSubClassObjectRequest">
        <wsdl:part name="parameters" element="ns:isSubClassObject"/>
    </wsdl:message>
    <wsdl:message name="isSubClassObjectResponse">
        <wsdl:part name="parameters" element="ns:isSubClassObjectResponse"/>
    </wsdl:message>
    <wsdl:portType name="TestServicePortType">
        <wsdl:operation name="objectSubClassAccessor">
            <wsdl:input message="ns:objectSubClassAccessorRequest" wsaw:Action="urn:objectSubClassAccessor"/>
        </wsdl:operation>
        <wsdl:operation name="isSubClassObject">
            <wsdl:input message="ns:isSubClassObjectRequest" wsaw:Action="urn:isSubClassObject"/>
            <wsdl:output message="ns:isSubClassObjectResponse" wsaw:Action="urn:isSubClassObjectResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="TestServiceSoap11Binding" type="ns:TestServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="objectSubClassAccessor">
            <soap:operation soapAction="urn:objectSubClassAccessor" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
        </wsdl:operation>
        <wsdl:operation name="isSubClassObject">
            <soap:operation soapAction="urn:isSubClassObject" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="TestServiceSoap12Binding" type="ns:TestServicePortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="objectSubClassAccessor">
            <soap12:operation soapAction="urn:objectSubClassAccessor" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
        </wsdl:operation>
        <wsdl:operation name="isSubClassObject">
            <soap12:operation soapAction="urn:isSubClassObject" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="TestServiceHttpBinding" type="ns:TestServicePortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="objectSubClassAccessor">
            <http:operation location="TestService/objectSubClassAccessor"/>
            <wsdl:input>
                <mime:content type="text/xml" part="objectSubClassAccessor"/>
            </wsdl:input>
        </wsdl:operation>
        <wsdl:operation name="isSubClassObject">
            <http:operation location="TestService/isSubClassObject"/>
            <wsdl:input>
                <mime:content type="text/xml" part="isSubClassObject"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="isSubClassObject"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="TestService">
        <wsdl:port name="TestServiceHttpSoap11Endpoint" binding="ns:TestServiceSoap11Binding">
            <soap:address location="http://localhost:8081/Axis2Bug/services/TestService.TestServiceHttpSoap11Endpoint/"/>
        </wsdl:port>
        <wsdl:port name="TestServiceHttpSoap12Endpoint" binding="ns:TestServiceSoap12Binding">
            <soap12:address location="http://localhost:8081/Axis2Bug/services/TestService.TestServiceHttpSoap12Endpoint/"/>
        </wsdl:port>
        <wsdl:port name="TestServiceHttpEndpoint" binding="ns:TestServiceHttpBinding">
            <http:address location="http://localhost:8081/Axis2Bug/services/TestService.TestServiceHttpEndpoint/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

-----Original Message-----
From: Prateek Asthana [mailto:paryanz@gmail.com]
Sent: 12. november 2010 12:54
To: java-user@axis.apache.org
Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work

Vladimir,
Can you post the complete WSDL here?

Prateek


On Thu, Nov 11, 2010 at 1:29 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:
> Hi,  Martin
>
> You example makes perfect sense, but the problem which I am experiencing
> with axis2 is different.
>
> I am going to slightly modify  your example to explain. What I did is I have
> added a new field to the subWorks class named title.
>
> I have created a method  called printWorksInfo which takes superclass(Works)
> as an input parameter. In the main class I am instantiating an instance of
> subWorks and passing it to that method.
>
> In plain java not considering axis2 "else if (works instance of subWorks) "
> condition would be true and I would be able to printout title.
>
>
>
> What would happen if class fubar would've been exposed as webservice using
> axis2, with printWorksInfo method,  is that by passing to that method
> subclass subWorks would result on the server side in instance of
> Superclass(Works) and that is my problem.
>
> XML which is send from client to the server would've clearly  identify that
> input parameter to the printWorksInfo method passed from the client  is of
> subWorks type, and it would've contain xml tag for title, but on the server
> side inside printWorksInfo it
>
> will be converted to Superclass(Works) and title value will be lost as it
> does not exists on superclass. See my original post I have described this
> situation with XML examples. In axis1 it works fine and in case subclass is
> passed to the method it is correctly desirealized from XML to java object of
> subclass instance. So the problem might be with the way axis2 deserialises
> XML.
>
>
>
> /*contents of base class Works*/
> package test;
>  public class Works
>  {
>    public int intValue=0;
>    public int getInt() { return this.intValue; }
>  }
>
> /*contents of base class subWorks */
> package test;
> public class subWorks extends Works
> {
>    public int intValue=1;
>
>    public String title = "title";
>
>    @Override
>    public int getInt() { return this.intValue; }
>
>    public String getTitle() {return this.title}
>
> }
>
> /*driver */
> package test;
> import test.Works;
> import test.subWorks;
> public class fubar
> {
> //now a test driver to determine what happens when a subclass is upcasted
>  public static void main(String [] args)
>  {
>
>   test.subWorks s  =new test.subWorks();
>   printWorkInfo(s);
>    } //end main
>
>  public void printWorksInfo(Works works) {
>
>   if (works instanceof Works) {
>
>       system.out.println("superclass");
>
>   } else if (works instance of subWorks) {
>
>       system.out.println("subclass");
>
>         Works s = (subWorks) works;
>
>         System.out.println("Works title: " s.getTitle());
>
>
>
>    } // end If
>
> } // end printWorksInfo
> } //end fubar class
>
>
>
>
> From: Martin Gainty [mailto:mgainty@hotmail.com]
> Sent: 11. november 2010 16:41
>
> To: java-user@axis.apache.org
> Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work
>
>
>
> Validimir
>
> take this example
>
> /*contents of base class Works*/
> package test;
>  public class Works
>  {
>    public int intValue=0;
>    public int getInt() { return this.intValue; }
>  }
>
> /*contents of base class subWorks */
> package test;
> public class subWorks extends Works
> {
>    public int intValue=1;
>    @Override
>    public int getInt() { return this.intValue; }
> }
>
> /*driver */
> package test;
> import test.Works;
> import test.subWorks;
> public class fubar
> {
> //now a test driver to determine what happens when a subclass is upcasted
>  public static void main(String [] args)
>  {
>   test.Works w     =new test.Works();
>   test.subWorks s  =new test.subWorks();
>    System.out.println("The original base class Works produces"+w.getInt());
>      System.out.println("The subclass subWorks produces "+s.getInt());
>  //now some upcasting
>      Works upcast=(subWorks)s;
>      System.out.println("The upcasted subclass produces"+upcast.getInt());
>    } //end main
> } //end fubar class
>
> classes>java -classpath .;%CLASSPATH% test.fubar
> The original base class Works produces0
> The subclass subWorks produces 1
> The upcasted subclass produces1
>
> /* the subclass when upcasted does NOT take on the characteristics of the
> parent base class */
>
> Martin Gainty
> ______________________________________________
> Jogi és Bizalmassági kinyilatkoztatás/Verzicht und
> Vertraulichkeitanmerkung/Note de déni et de confidentialité
>
>
>
> Ez az üzenet bizalmas.  Ha nem ön az akinek szánva volt, akkor kérjük, hogy
> jelentse azt nekünk vissza. Semmiféle továbbítása vagy másolatának készítése
> nem megengedett.  Ez az üzenet csak ismeret cserét szolgál és semmiféle jogi
> alkalmazhatósága sincs.  Mivel az electronikus üzenetek könnyen
> megváltoztathatóak, ezért minket semmi felelöség nem terhelhet ezen üzenet
> tartalma miatt.
>
> Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene
> Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte
> Weiterleitung oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht
> dient lediglich dem Austausch von Informationen und entfaltet keine
> rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von
> E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.
>
> Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le
> destinataire prévu, nous te demandons avec bonté que pour satisfaire
> informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie
> de ceci est interdite. Ce message sert à l'information seulement et n'aura
> pas n'importe quel effet légalement obligatoire. Étant donné que les email
> peuvent facilement être sujets à la manipulation, nous ne pouvons accepter
> aucune responsabilité pour le contenu fourni.
>
>
>
>
>
> ________________________________
>
> From: vd@cdrator.com
> To: java-user@axis.apache.org
> Date: Thu, 11 Nov 2010 15:55:40 +0100
> Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work
>
> Hi,
>
>
>
> Yes you are right superclass could not be cast to subclass, but in my
> example I am passing Subclass to the method which takes Superclass as an
> argument, which is fine.
>
>
>
> From: Supun Malinga [mailto:supunm@wso2.com]
> Sent: 11. november 2010 14:58
> To: java-user@axis.apache.org
> Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work
>
>
>
>
>
> On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:
>
> I am experiencing some problems converting XML requests on the server side,
> in case XML requests contain xsi:type parameter.
>
>
>
> The setup is following
>
>
>
> Two objects:
>
>
>
> ObjectSubClass extends ObjectSuperClass
>
>
>
> A webservice with a method: getObject(ObjectSuperClass obj)
>
>
>
> In wsdl these objects defined in the following way:
>
>
>
> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
>
> targetNamespace="http://mypackage.com/xsd">
>
> <xs:complexType name="ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
>
> <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:complexType>
>
> <xs:complexType name="ObjectSubClass">
>
> <xs:complexContent>
>
> <xs:extension base="ax21:ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:extension>
>
> </xs:complexContent>
>
> </xs:complexType>
>
> </xs:schema>
>
> From the client I am calling this method by passing to it subclass -
> ObjectSubClass which has one extrafield -- phone:
>
>
>
> ObjectSubClass obj = new ObjectSubclass();
>
> obj.setId("some id");
>
> obj.setName("some name");
>
> obj.setPhone("some phone");
>
> getObject(obj);
>
>
>
> In the request XML object is represented like that:
>
>
>
> <obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
>
> <id>1</id>
>
> <name>test</name>
>
> <q1:phone>123</q1:phone>
>
> </obj>
>
> But on the server side no matter if I am passing instance of
> ObjectSuperClass or instance of ObjectSubClass I am getting always instance
> of superclass ObjectSuperClass, even when xsi:type specifies that object is
> of subclass ObjectSubClasstype. As a result I am not getting values present
> on ObjectSubClass and getting only values defined in superclass
> ObjectSuperClass.
>
> hi,
> may be i'm wrong, i'm still a newbe here. :)
>
> but, didn't the casting of the superclass object  to the subclass object
> work?
>
> thanks,
>
>
>
> Same structure worked fine in axis1 ans xsi:type was respected.
>
>
>
> Maybe it is some configuration in axis2.
>
>
>
> I would be really thankful for any help.
>
>
>
>
>
>
> --
> Supun Malinga,
>
> Software Engineer,
> WSO2 Inc.
> http://wso2.com
> http://wso2.org
> email - supunm@wso2.com
> mobile - 071 56 91 321

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@axis.apache.org
For additional commands, e-mail: java-user-help@axis.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@axis.apache.org
For additional commands, e-mail: java-user-help@axis.apache.org


Re: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Prateek Asthana <pa...@gmail.com>.
Vladimir,
Can you post the complete WSDL here?

Prateek


On Thu, Nov 11, 2010 at 1:29 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:
> Hi,  Martin
>
> You example makes perfect sense, but the problem which I am experiencing
> with axis2 is different.
>
> I am going to slightly modify  your example to explain. What I did is I have
> added a new field to the subWorks class named title.
>
> I have created a method  called printWorksInfo which takes superclass(Works)
> as an input parameter. In the main class I am instantiating an instance of
> subWorks and passing it to that method.
>
> In plain java not considering axis2 “else if (works instance of subWorks) “
> condition would be true and I would be able to printout title.
>
>
>
> What would happen if class fubar would’ve been exposed as webservice using
> axis2, with printWorksInfo method,  is that by passing to that method
> subclass subWorks would result on the server side in instance of
> Superclass(Works) and that is my problem.
>
> XML which is send from client to the server would’ve clearly  identify that
> input parameter to the printWorksInfo method passed from the client  is of
> subWorks type, and it would’ve contain xml tag for title, but on the server
> side inside printWorksInfo it
>
> will be converted to Superclass(Works) and title value will be lost as it
> does not exists on superclass. See my original post I have described this
> situation with XML examples. In axis1 it works fine and in case subclass is
> passed to the method it is correctly desirealized from XML to java object of
> subclass instance. So the problem might be with the way axis2 deserialises
> XML.
>
>
>
> /*contents of base class Works*/
> package test;
>  public class Works
>  {
>    public int intValue=0;
>    public int getInt() { return this.intValue; }
>  }
>
> /*contents of base class subWorks */
> package test;
> public class subWorks extends Works
> {
>    public int intValue=1;
>
>    public String title = “title”;
>
>    @Override
>    public int getInt() { return this.intValue; }
>
>    public String getTitle() {return this.title}
>
> }
>
> /*driver */
> package test;
> import test.Works;
> import test.subWorks;
> public class fubar
> {
> //now a test driver to determine what happens when a subclass is upcasted
>  public static void main(String [] args)
>  {
>
>   test.subWorks s  =new test.subWorks();
>   printWorkInfo(s);
>    } //end main
>
>  public void printWorksInfo(Works works) {
>
>   if (works instanceof Works) {
>
>       system.out.println(“superclass”);
>
>   } else if (works instance of subWorks) {
>
>       system.out.println(“subclass”);
>
>         Works s = (subWorks) works;
>
>         System.out.println(“Works title: ” s.getTitle());
>
>
>
>    } // end If
>
> } // end printWorksInfo
> } //end fubar class
>
>
>
>
> From: Martin Gainty [mailto:mgainty@hotmail.com]
> Sent: 11. november 2010 16:41
>
> To: java-user@axis.apache.org
> Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work
>
>
>
> Validimir
>
> take this example
>
> /*contents of base class Works*/
> package test;
>  public class Works
>  {
>    public int intValue=0;
>    public int getInt() { return this.intValue; }
>  }
>
> /*contents of base class subWorks */
> package test;
> public class subWorks extends Works
> {
>    public int intValue=1;
>    @Override
>    public int getInt() { return this.intValue; }
> }
>
> /*driver */
> package test;
> import test.Works;
> import test.subWorks;
> public class fubar
> {
> //now a test driver to determine what happens when a subclass is upcasted
>  public static void main(String [] args)
>  {
>   test.Works w     =new test.Works();
>   test.subWorks s  =new test.subWorks();
>    System.out.println("The original base class Works produces"+w.getInt());
>      System.out.println("The subclass subWorks produces "+s.getInt());
>  //now some upcasting
>      Works upcast=(subWorks)s;
>      System.out.println("The upcasted subclass produces"+upcast.getInt());
>    } //end main
> } //end fubar class
>
> classes>java -classpath .;%CLASSPATH% test.fubar
> The original base class Works produces0
> The subclass subWorks produces 1
> The upcasted subclass produces1
>
> /* the subclass when upcasted does NOT take on the characteristics of the
> parent base class */
>
> Martin Gainty
> ______________________________________________
> Jogi és Bizalmassági kinyilatkoztatás/Verzicht und
> Vertraulichkeitanmerkung/Note de déni et de confidentialité
>
>
>
> Ez az üzenet bizalmas.  Ha nem ön az akinek szánva volt, akkor kérjük, hogy
> jelentse azt nekünk vissza. Semmiféle továbbítása vagy másolatának készítése
> nem megengedett.  Ez az üzenet csak ismeret cserét szolgál és semmiféle jogi
> alkalmazhatósága sincs.  Mivel az electronikus üzenetek könnyen
> megváltoztathatóak, ezért minket semmi felelöség nem terhelhet ezen üzenet
> tartalma miatt.
>
> Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene
> Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte
> Weiterleitung oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht
> dient lediglich dem Austausch von Informationen und entfaltet keine
> rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von
> E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.
>
> Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le
> destinataire prévu, nous te demandons avec bonté que pour satisfaire
> informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie
> de ceci est interdite. Ce message sert à l'information seulement et n'aura
> pas n'importe quel effet légalement obligatoire. Étant donné que les email
> peuvent facilement être sujets à la manipulation, nous ne pouvons accepter
> aucune responsabilité pour le contenu fourni.
>
>
>
>
>
> ________________________________
>
> From: vd@cdrator.com
> To: java-user@axis.apache.org
> Date: Thu, 11 Nov 2010 15:55:40 +0100
> Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work
>
> Hi,
>
>
>
> Yes you are right superclass could not be cast to subclass, but in my
> example I am passing Subclass to the method which takes Superclass as an
> argument, which is fine.
>
>
>
> From: Supun Malinga [mailto:supunm@wso2.com]
> Sent: 11. november 2010 14:58
> To: java-user@axis.apache.org
> Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work
>
>
>
>
>
> On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:
>
> I am experiencing some problems converting XML requests on the server side,
> in case XML requests contain xsi:type parameter.
>
>
>
> The setup is following
>
>
>
> Two objects:
>
>
>
> ObjectSubClass extends ObjectSuperClass
>
>
>
> A webservice with a method: getObject(ObjectSuperClass obj)
>
>
>
> In wsdl these objects defined in the following way:
>
>
>
> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
>
> targetNamespace="http://mypackage.com/xsd">
>
> <xs:complexType name="ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
>
> <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:complexType>
>
> <xs:complexType name="ObjectSubClass">
>
> <xs:complexContent>
>
> <xs:extension base="ax21:ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:extension>
>
> </xs:complexContent>
>
> </xs:complexType>
>
> </xs:schema>
>
> From the client I am calling this method by passing to it subclass –
> ObjectSubClass which has one extrafield -- phone:
>
>
>
> ObjectSubClass obj = new ObjectSubclass();
>
> obj.setId(“some id”);
>
> obj.setName(“some name”);
>
> obj.setPhone(“some phone”);
>
> getObject(obj);
>
>
>
> In the request XML object is represented like that:
>
>
>
> <obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
>
> <id>1</id>
>
> <name>test</name>
>
> <q1:phone>123</q1:phone>
>
> </obj>
>
> But on the server side no matter if I am passing instance of
> ObjectSuperClass or instance of ObjectSubClass I am getting always instance
> of superclass ObjectSuperClass, even when xsi:type specifies that object is
> of subclass ObjectSubClasstype. As a result I am not getting values present
> on ObjectSubClass and getting only values defined in superclass
> ObjectSuperClass.
>
> hi,
> may be i'm wrong, i'm still a newbe here. :)
>
> but, didn't the casting of the superclass object  to the subclass object
> work?
>
> thanks,
>
>
>
> Same structure worked fine in axis1 ans xsi:type was respected.
>
>
>
> Maybe it is some configuration in axis2.
>
>
>
> I would be really thankful for any help.
>
>
>
>
>
>
> --
> Supun Malinga,
>
> Software Engineer,
> WSO2 Inc.
> http://wso2.com
> http://wso2.org
> email - supunm@wso2.com
> mobile - 071 56 91 321

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@axis.apache.org
For additional commands, e-mail: java-user-help@axis.apache.org


RE: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Vladimir Duloglo <vd...@cdrator.com>.
Hi,  Martin
You example makes perfect sense, but the problem which I am experiencing with axis2 is different.
I am going to slightly modify  your example to explain. What I did is I have added a new field to the subWorks class named title.
I have created a method  called printWorksInfo which takes superclass(Works) as an input parameter. In the main class I am instantiating an instance of subWorks and passing it to that method.
In plain java not considering axis2 "else if (works instance of subWorks) " condition would be true and I would be able to printout title.

What would happen if class fubar would've been exposed as webservice using axis2, with printWorksInfo method,  is that by passing to that method subclass subWorks would result on the server side in instance of Superclass(Works) and that is my problem.
XML which is send from client to the server would've clearly  identify that input parameter to the printWorksInfo method passed from the client  is of subWorks type, and it would've contain xml tag for title, but on the server side inside printWorksInfo it
will be converted to Superclass(Works) and title value will be lost as it does not exists on superclass. See my original post I have described this situation with XML examples. In axis1 it works fine and in case subclass is passed to the method it is correctly desirealized from XML to java object of subclass instance. So the problem might be with the way axis2 deserialises XML.

/*contents of base class Works*/
package test;
 public class Works
 {
   public int intValue=0;
   public int getInt() { return this.intValue; }
 }

/*contents of base class subWorks */
package test;
public class subWorks extends Works
{
   public int intValue=1;
   public String title = "title";
   @Override
   public int getInt() { return this.intValue; }
   public String getTitle() {return this.title}
}

/*driver */
package test;
import test.Works;
import test.subWorks;
public class fubar
{
//now a test driver to determine what happens when a subclass is upcasted
 public static void main(String [] args)
 {

  test.subWorks s  =new test.subWorks();
  printWorkInfo(s);
   } //end main
 public void printWorksInfo(Works works) {
  if (works instanceof Works) {
      system.out.println("superclass");
  } else if (works instance of subWorks) {
      system.out.println("subclass");
        Works s = (subWorks) works;
        System.out.println("Works title: " s.getTitle());

   } // end If
} // end printWorksInfo
} //end fubar class


From: Martin Gainty [mailto:mgainty@hotmail.com]
Sent: 11. november 2010 16:41
To: java-user@axis.apache.org
Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work

Validimir

take this example

/*contents of base class Works*/
package test;
 public class Works
 {
   public int intValue=0;
   public int getInt() { return this.intValue; }
 }

/*contents of base class subWorks */
package test;
public class subWorks extends Works
{
   public int intValue=1;
   @Override
   public int getInt() { return this.intValue; }
}

/*driver */
package test;
import test.Works;
import test.subWorks;
public class fubar
{
//now a test driver to determine what happens when a subclass is upcasted
 public static void main(String [] args)
 {
  test.Works w     =new test.Works();
  test.subWorks s  =new test.subWorks();
   System.out.println("The original base class Works produces"+w.getInt());
     System.out.println("The subclass subWorks produces "+s.getInt());
 //now some upcasting
     Works upcast=(subWorks)s;
     System.out.println("The upcasted subclass produces"+upcast.getInt());
   } //end main
} //end fubar class

classes>java -classpath .;%CLASSPATH% test.fubar
The original base class Works produces0
The subclass subWorks produces 1
The upcasted subclass produces1

/* the subclass when upcasted does NOT take on the characteristics of the parent base class */

Martin Gainty
______________________________________________
Jogi és Bizalmassági kinyilatkoztatás/Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité

Ez az üzenet bizalmas.  Ha nem ön az akinek szánva volt, akkor kérjük, hogy jelentse azt nekünk vissza. Semmiféle továbbítása vagy másolatának készítése nem megengedett.  Ez az üzenet csak ismeret cserét szolgál és semmiféle jogi alkalmazhatósága sincs.  Mivel az electronikus üzenetek könnyen megváltoztathatóak, ezért minket semmi felelöség nem terhelhet ezen üzenet tartalma miatt.

Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht dient lediglich dem Austausch von Informationen und entfaltet keine rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.

Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le destinataire prévu, nous te demandons avec bonté que pour satisfaire informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie de ceci est interdite. Ce message sert à l'information seulement et n'aura pas n'importe quel effet légalement obligatoire. Étant donné que les email peuvent facilement être sujets à la manipulation, nous ne pouvons accepter aucune responsabilité pour le contenu fourni.





________________________________
From: vd@cdrator.com
To: java-user@axis.apache.org
Date: Thu, 11 Nov 2010 15:55:40 +0100
Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work
Hi,

Yes you are right superclass could not be cast to subclass, but in my example I am passing Subclass to the method which takes Superclass as an argument, which is fine.

From: Supun Malinga [mailto:supunm@wso2.com]
Sent: 11. november 2010 14:58
To: java-user@axis.apache.org
Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work


On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com>> wrote:
I am experiencing some problems converting XML requests on the server side, in case XML requests contain xsi:type parameter.

The setup is following

Two objects:

ObjectSubClass extends ObjectSuperClass

A webservice with a method: getObject(ObjectSuperClass obj)

In wsdl these objects defined in the following way:

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://mypackage.com/xsd">
<xs:complexType name="ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ObjectSubClass">
<xs:complexContent>
<xs:extension base="ax21:ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
>From the client I am calling this method by passing to it subclass - ObjectSubClass which has one extrafield -- phone:

ObjectSubClass obj = new ObjectSubclass();
obj.setId("some id");
obj.setName("some name");
obj.setPhone("some phone");
getObject(obj);

In the request XML object is represented like that:

<obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
<id>1</id>
<name>test</name>
<q1:phone>123</q1:phone>
</obj>
But on the server side no matter if I am passing instance of ObjectSuperClass or instance of ObjectSubClass I am getting always instance of superclass ObjectSuperClass, even when xsi:type specifies that object is of subclass ObjectSubClasstype. As a result I am not getting values present on ObjectSubClass and getting only values defined in superclass ObjectSuperClass.
hi,
may be i'm wrong, i'm still a newbe here. :)

but, didn't the casting of the superclass object  to the subclass object work?

thanks,

Same structure worked fine in axis1 ans xsi:type was respected.

Maybe it is some configuration in axis2.

I would be really thankful for any help.





--
Supun Malinga,

Software Engineer,
WSO2 Inc.
http://wso2.com<http://wso2.com/>
http://wso2.org<http://wso2.org/>
email - supunm@wso2.com<ma...@wso2.com>
mobile - 071 56 91 321

RE: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Martin Gainty <mg...@hotmail.com>.
Validimir

take this example

/*contents of base class Works*/
package test;
 public class Works
 {
   public int intValue=0;
   public int getInt() { return this.intValue; }
 }
 
/*contents of base class subWorks */
package test;
public class subWorks extends Works
{
   public int intValue=1;
   @Override
   public int getInt() { return this.intValue; }
}

/*driver */
package test;
import test.Works;
import test.subWorks;
public class fubar
{
//now a test driver to determine what happens when a subclass is upcasted
 public static void main(String [] args)
 {
  test.Works w     =new test.Works();
  test.subWorks s  =new test.subWorks();
   System.out.println("The original base class Works produces"+w.getInt());
     System.out.println("The subclass subWorks produces "+s.getInt());
 //now some upcasting
     Works upcast=(subWorks)s;
     System.out.println("The upcasted subclass produces"+upcast.getInt());
   } //end main
} //end fubar class
 
classes>java -classpath .;%CLASSPATH% test.fubar
The original base class Works produces0
The subclass subWorks produces 1
The upcasted subclass produces1
 
/* the subclass when upcasted does NOT take on the characteristics of the parent base class */
 
Martin Gainty 
______________________________________________ 
Jogi és Bizalmassági kinyilatkoztatás/Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité

 
Ez az üzenet bizalmas.  Ha nem ön az akinek szánva volt, akkor kérjük, hogy jelentse azt nekünk vissza. Semmiféle továbbítása vagy másolatának készítése nem megengedett.  Ez az üzenet csak ismeret cserét szolgál és semmiféle jogi alkalmazhatósága sincs.  Mivel az electronikus üzenetek könnyen megváltoztathatóak, ezért minket semmi felelöség nem terhelhet ezen üzenet tartalma miatt.

Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht dient lediglich dem Austausch von Informationen und entfaltet keine rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.
Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le destinataire prévu, nous te demandons avec bonté que pour satisfaire informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie de ceci est interdite. Ce message sert à l'information seulement et n'aura pas n'importe quel effet légalement obligatoire. Étant donné que les email peuvent facilement être sujets à la manipulation, nous ne pouvons accepter aucune responsabilité pour le contenu fourni.



 



From: vd@cdrator.com
To: java-user@axis.apache.org
Date: Thu, 11 Nov 2010 15:55:40 +0100
Subject: RE: [AXIS2]. axis2. xsi:type object mapping does not work






Hi, 
 
Yes you are right superclass could not be cast to subclass, but in my example I am passing Subclass to the method which takes Superclass as an argument, which is fine.
 

From: Supun Malinga [mailto:supunm@wso2.com] 
Sent: 11. november 2010 14:58
To: java-user@axis.apache.org
Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work
 
 

On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:


I am experiencing some problems converting XML requests on the server side, in case XML requests contain xsi:type parameter. 
 
The setup is following
 
Two objects:
 
ObjectSubClass extends ObjectSuperClass
 
A webservice with a method: getObject(ObjectSuperClass obj)
 
In wsdl these objects defined in the following way:
 
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"  
targetNamespace="http://mypackage.com/xsd"> 
<xs:complexType name="ObjectSuperClass"> 
<xs:sequence> 
<xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/> 
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="ObjectSubClass"> 
<xs:complexContent> 
<xs:extension base="ax21:ObjectSuperClass"> 
<xs:sequence> 
<xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/> 
</xs:sequence> 
</xs:extension> 
</xs:complexContent> 
</xs:complexType> 
</xs:schema> 
>From the client I am calling this method by passing to it subclass – ObjectSubClass which has one extrafield -- phone:
 
ObjectSubClass obj = new ObjectSubclass();
obj.setId(“some id”);
obj.setName(“some name”);
obj.setPhone(“some phone”);
getObject(obj);
 
In the request XML object is represented like that:
 
<obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd"> 
<id>1</id> 
<name>test</name> 
<q1:phone>123</q1:phone> 
</obj> 
But on the server side no matter if I am passing instance of ObjectSuperClass or instance of ObjectSubClass I am getting always instance of superclass ObjectSuperClass, even when xsi:type specifies that object is of subclass ObjectSubClasstype. As a result I am not getting values present on ObjectSubClass and getting only values defined in superclass ObjectSuperClass.

hi,
may be i'm wrong, i'm still a newbe here. :)

but, didn't the casting of the superclass object  to the subclass object work?

thanks,



 
Same structure worked fine in axis1 ans xsi:type was respected.
 
Maybe it is some configuration in axis2.
 
I would be really thankful for any help.
 
 


-- 
Supun Malinga,

Software Engineer,
WSO2 Inc.
http://wso2.com
http://wso2.org
email - supunm@wso2.com
mobile - 071 56 91 321 		 	   		  

RE: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Vladimir Duloglo <vd...@cdrator.com>.
Hi,

Yes you are right superclass could not be cast to subclass, but in my example I am passing Subclass to the method which takes Superclass as an argument, which is fine.

From: Supun Malinga [mailto:supunm@wso2.com]
Sent: 11. november 2010 14:58
To: java-user@axis.apache.org
Subject: Re: [AXIS2]. axis2. xsi:type object mapping does not work


On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com>> wrote:
I am experiencing some problems converting XML requests on the server side, in case XML requests contain xsi:type parameter.

The setup is following

Two objects:

ObjectSubClass extends ObjectSuperClass

A webservice with a method: getObject(ObjectSuperClass obj)

In wsdl these objects defined in the following way:

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://mypackage.com/xsd">
<xs:complexType name="ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ObjectSubClass">
<xs:complexContent>
<xs:extension base="ax21:ObjectSuperClass">
<xs:sequence>
<xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
>From the client I am calling this method by passing to it subclass - ObjectSubClass which has one extrafield -- phone:

ObjectSubClass obj = new ObjectSubclass();
obj.setId("some id");
obj.setName("some name");
obj.setPhone("some phone");
getObject(obj);

In the request XML object is represented like that:

<obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
<id>1</id>
<name>test</name>
<q1:phone>123</q1:phone>
</obj>
But on the server side no matter if I am passing instance of ObjectSuperClass or instance of ObjectSubClass I am getting always instance of superclass ObjectSuperClass, even when xsi:type specifies that object is of subclass ObjectSubClasstype. As a result I am not getting values present on ObjectSubClass and getting only values defined in superclass ObjectSuperClass.
hi,
may be i'm wrong, i'm still a newbe here. :)

but, didn't the casting of the superclass object  to the subclass object work?

thanks,

Same structure worked fine in axis1 ans xsi:type was respected.

Maybe it is some configuration in axis2.

I would be really thankful for any help.





--
Supun Malinga,

Software Engineer,
WSO2 Inc.
http://wso2.com
http://wso2.org
email - supunm@wso2.com<ma...@wso2.com>
mobile - 071 56 91 321

Re: [AXIS2]. axis2. xsi:type object mapping does not work

Posted by Supun Malinga <su...@wso2.com>.
On Thu, Nov 11, 2010 at 5:30 PM, Vladimir Duloglo <vd...@cdrator.com> wrote:

> I am experiencing some problems converting XML requests on the server side,
> in case XML requests contain xsi:type parameter.
>
>
>
> The setup is following
>
>
>
> Two objects:
>
>
>
> ObjectSubClass extends ObjectSuperClass
>
>
>
> A webservice with a method: getObject(ObjectSuperClass obj)
>
>
>
> In wsdl these objects defined in the following way:
>
>
>
> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
>
>
> targetNamespace="http://mypackage.com/xsd">
>
> <xs:complexType name="ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/>
>
> <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:complexType>
>
> <xs:complexType name="ObjectSubClass">
>
> <xs:complexContent>
>
> <xs:extension base="ax21:ObjectSuperClass">
>
> <xs:sequence>
>
> <xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
>
> </xs:sequence>
>
> </xs:extension>
>
> </xs:complexContent>
>
> </xs:complexType>
>
> </xs:schema>
>
> From the client I am calling this method by passing to it subclass –
> ObjectSubClass which has one extrafield -- phone:
>
>
>
> ObjectSubClass obj = new ObjectSubclass();
>
> obj.setId(“some id”);
>
> obj.setName(“some name”);
>
> obj.setPhone(“some phone”);
>
> getObject(obj);
>
>
>
> In the request XML object is represented like that:
>
>
>
> <obj xsi:type="q1:ObjectSubClass" xmlns:q1="http://mypackage.com/xsd">
>
> <id>1</id>
>
> <name>test</name>
>
> <q1:phone>123</q1:phone>
>
> </obj>
>
> But on the server side no matter if I am passing instance of
> ObjectSuperClass or instance of ObjectSubClass I am getting always instance
> of superclass ObjectSuperClass, even when xsi:type specifies that object is
> of subclass ObjectSubClasstype. As a result I am not getting values present
> on ObjectSubClass and getting only values defined in superclass
> ObjectSuperClass.
>
hi,
may be i'm wrong, i'm still a newbe here. :)

but, didn't the casting of the superclass object  to the subclass object
work?

thanks,

>
>
> Same structure worked fine in axis1 ans xsi:type was respected.
>
>
>
> Maybe it is some configuration in axis2.
>
>
>
> I would be really thankful for any help.
>
>
>
>
>



-- 
Supun Malinga,

Software Engineer,
WSO2 Inc.
http://wso2.com
http://wso2.org
email - supunm@wso2.com <su...@wso2.com>
mobile - 071 56 91 321