users@jax-rpc.java.net

RE: Re: please help - jaxrpc in jwsdp1.2 fails deserializing base/super class

From: Nan Xiong <Nan.Xiong_at_viewstar.com>
Date: Fri, 17 Oct 2003 10:20:39 -0700

Doug,
Sorry for the delay. I made a very simple .NET service to reproduce the same problem. Attached in the email is the wsdl file - service1.wsdl.

The .NET service code is very simple in C# as shown below. The problem is demonstrated in sayHello operation, which returns a Hello type, whose Base type is HelloBase, having 2 [XmlAttribute] annotated properties. From jwsdp jaxrpc client, getMessage() returns proper value, but getName() and getDescription() always returns null.

Let me know if you need more info...
Thanks again
Nan

++++++++++ CUT HERE ++++++++++++

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Xml.Serialization;

namespace WebService1
{
        /// <summary>
        /// Summary description for Service1.
        /// </summary>
        [WebService(
                 Namespace="http://viewstart.com",
                 Name="Hello Web Service",
         Description="My Hello Web Service")]
        public class Service1 : System.Web.Services.WebService
        {
                public Service1()
                {
                        //CODEGEN: This call is required by the ASP.NET Web Services Designer
                        InitializeComponent();
                }

                #region Component Designer generated code
                
                //Required by the Web Services Designer
                private IContainer components = null;
                                
                /// <summary>
                /// Required method for Designer support - do not modify
                /// the contents of this method with the code editor.
                /// </summary>
                private void InitializeComponent()
                {
                }

                /// <summary>
                /// Clean up any resources being used.
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if(disposing && components != null)
                        {
                                components.Dispose();
                        }
                        base.Dispose(disposing);
                }
                
                #endregion

                // WEB SERVICE EXAMPLE
                // The HelloWorld() example service returns the string Hello World
                // To build, uncomment the following lines then save and build the project
                // To test this web service, press F5

                [WebMethod]
                public string HelloWorld()
                {
                        return "hello world!";
                }

                [WebMethod]
                public Hello SayHello()
                {
                        Hello hello = new Hello();
                        return hello;
                }
        }


        public abstract class HelloBase
        {
                private string name = "TestName";
                private string description = "TestDesc";

                public HelloBase()
                {
                }

                [XmlAttribute]
                public virtual string Name
                {
                        get
                        {
                                return name;
                        }
                        set
                        {
                                name = value;
                        }
                }

                [XmlAttribute]
                public virtual string Description
                {
                        get
                        {
                                return description;
                        }
                        set
                        {
                                description = value;
                        }
                }

        }

        public class Hello : HelloBase
        {
                private string message="HELLO!";

                public Hello()
                {
                }

                public virtual string Message
                {
                        get
                        {
                                return message;
                        }
                        set
                        {
                                message = value;
                        }
                }
        }
                
}

> -----Original Message-----
> From: Doug Kohlert [mailto:Doug.Kohlert_at_Sun.COM]
> Sent: Thursday, October 16, 2003 5:59 PM
> To: users_at_jax-rpc.dev.java.net
> Subject: Re: please help - jaxrpc in jwsdp1.2 fails deserializing
> base/super class
>
>
> Nan,
> You may have discovered a bug. Would it be possible for you to
> post the entire WSDL you are using?
>
> Thanks
>
> Nan Xiong wrote:
> > Hello,
> > I have a .NET service that uses an abstract base class,
> where it properties are [XmlAttribute] annotated, meaning
> that the properties exposed in this abstract base class are
> serialized into xml attributes
> > instead of xml elements in the soap message by .NET.
> >
> > I created client files using jwsdp1.2 wscompile with
> -f:searchschema on, the base class's serializer
> > seems understand those are xml attributes (see pasted
> generated code), but it appears the doDeserialize()
> > in the base class never get called at the runtime, the
> result is that those properties are not get set/deserialized
> at all on the client side - they are always null.
> >
> > Same .NET services works properly with a Axis1.1 client.
> >
> > I pasted some relevant lines from wsdl and wscompile
> generated files in this email, please let me know
> > whether this is a bug in jwsdp, or i some other flags i
> should used in wscompile? Any workaround for now?
> >
> > Changing those properties to not [XmlAttribute] annotated,
> works in jwsdp, but we need this for backward compatibility.
> If [XmlAttribute] is used in a non base class, it also works on jwsdp.
> >
> > l can provide more detailed info if needed to.
> >
> > Thanks in advance!
> > Nan
> >
> > ++++++++++ part of WSDL +++++++++++++++
> > <s:complexType name="ProcessElement" abstract="true">
> > <s:attribute name="Name" type="s:string" />
> > <s:attribute name="Description" type="s:string" />
> > </s:complexType>
> >
> > <s:complexType name="Worklist">
> > <s:complexContent mixed="false">
> > <s:extension base="s0:ProcessElement">
> > <s:sequence>
> > <s:element minOccurs="0" maxOccurs="1"
> name="Template" type="s0:Template" />
> > </s:sequence>
> > </s:extension>
> > </s:complexContent>
> > </s:complexType>
> >
> > ++++++++ part of SOAP response from .NET ++++++++++++
> > <Worklist Name="WFSERVE" Description="Default Process
> Agent"><Template Name="WFTASK"
> Description="WFTASK"><Fields><Field Name="STATUS"
> Description="Status"><Displayed>false</Displayed><Type>Short</
> Type><Label>Status</Label><ColumnLabel>Status</ColumnLabel><Wi
> dth>0</Width><ColumnWidth>4</ColumnWidth></Field><Field
> Name=":REQID" Description="Request
> ID"><Displayed>true</Displayed><Type>Integer</Type><Label>Requ
> est ID</Label><ColumnLabel>Request
> ID</ColumnLabel><Width>0</Width><ColumnWidth>11</ColumnWidth><
> /Field><Field Name=":TSKTYPE" Description="Task
> Type"><Displayed>true</Displayed><Type>String</Type><Label>Tas
> k Type</Label><ColumnLabel>Task
> Type</ColumnLabel><Width>10</Width><ColumnWidth>10</ColumnWidt
> h></Field><Field Name=":TSKNAME" Description="Task
> Name"><Displayed>true</Displayed><Type>String</Type><Label>Tas
> k Name</Label><ColumnLabel>Task
> Name</ColumnLabel><Width>10</Width><ColumnWidth>11</ColumnWidt
> h></Field><Field Name=":PRIORITY" Description="Priority"><Displayed
> >true</Displayed><Type>Integer</Type><Label>Priority</Label><C
> olumnLabel>Priority</ColumnLabel><Width>0</Width><ColumnWidth>
> 8</ColumnWidth></Field><Field Name=":ASYNC"
> Description="Async"><Displayed>true</Displayed><Type>String</T
> ype><Label>Async</Label><ColumnLabel>Async</ColumnLabel><Width
> >1</Width><ColumnWidth>5</ColumnWidth></Field><Field
> Name="RECID" Description="Record
> ID"><Displayed>false</Displayed><Type>Integer</Type><Label>Rec
> ord ID</Label><ColumnLabel>Record
> ID</ColumnLabel><Width>0</Width><ColumnWidth>0</ColumnWidth></
> Field><Field Name="QUEID" Description="Queue
> ID"><Displayed>false</Displayed><Type>Integer</Type><Label>Que
> ue ID</Label><ColumnLabel>Queue
> ID</ColumnLabel><Width>0</Width><ColumnWidth>0</ColumnWidth></
> Field><Field Name="CPFILE"
> Description="Filename"><Displayed>false</Displayed><Type>AllCa
> p</Type><Label>Filename</Label><ColumnLabel>Filename</ColumnLa
> bel><Width>80</Width><ColumnWidth>0</ColumnWidth></Field></Fie
> lds></Template></Worklist>
> >
> > +++++++++ doDeserialize() in the subclass
> WorkList_LiteralSerializer ++++++++
> > public Object doDeserialize(XMLReader reader,
> > SOAPDeserializationContext context) throws Exception {
> > com.viewstar.webservices.Worklist instance = new
> com.viewstar.webservices.Worklist();
> > Object member=null;
> > QName elementName;
> > List values;
> > Object value;
> >
> > reader.nextElementContent();
> > elementName = reader.getName();
> > if (reader.getState() == XMLReader.START) {
> > if (elementName.equals(ns1_Template_QNAME)) {
> > member =
> ns1_myTemplate_LiteralSerializer.deserialize(ns1_Template_QNAM
> E, reader, context);
> > if (member == null) {
> > throw new
> DeserializationException("literal.unexpectedNull");
> > }
> >
> instance.setTemplate((com.viewstar.webservices.Template)member);
> > reader.nextElementContent();
> > }
> > }
> >
> > XMLReaderUtil.verifyReaderState(reader, XMLReader.END);
> > return (Object)instance;
> > }
> >
> > ++++++++ doDeserialize() in the base class
> ProcessElement_LiteralSerializer +++++++++
> > public Object doDeserialize(XMLReader reader,
> > SOAPDeserializationContext context) throws Exception {
> > com.viewstar.webservices.ProcessElement instance =
> new com.viewstar.webservices.ProcessElement();
> > Object member=null;
> > QName elementName;
> > List values;
> > Object value;
> >
> > Attributes attributes = reader.getAttributes();
> > String attribute = null;
> > attribute = attributes.getValue(ns3_Name_QNAME);
> > if (attribute != null) {
> > member =
> XSDStringEncoder.getInstance().stringToObject(attribute, reader);
> > instance.setName((java.lang.String)member);
> > }
> > attribute = attributes.getValue(ns3_Description_QNAME);
> > if (attribute != null) {
> > member =
> XSDStringEncoder.getInstance().stringToObject(attribute, reader);
> > instance.setDescription((java.lang.String)member);
> > }
> >
> > reader.nextElementContent();
> > XMLReaderUtil.verifyReaderState(reader, XMLReader.END);
> > return (Object)instance;
> > }
> >
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe_at_jax-rpc.dev.java.net
> > For additional commands, e-mail: users-help_at_jax-rpc.dev.java.net
> >
> >
>
>
> --
> Doug Kohlert
> Java Software Division
> Sun Microsystems, Inc.
> phone: 503 345-9806
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jax-rpc.dev.java.net
> For additional commands, e-mail: users-help_at_jax-rpc.dev.java.net
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe_at_jax-rpc.dev.java.net
For additional commands, e-mail: users-help_at_jax-rpc.dev.java.net