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 "Chisholm, Paul" <Pa...@AirservicesAustralia.com> on 2007/04/26 02:00:15 UTC

XML attributes are null after transmission

Hi,

I am having a problem with data that is transferred via XML attributes.
Namely, when an object is constructed after receiving a message the
getter corresponding to an attribute returns null.

I start with a WSDL file and use XMLBeans data binding. The following
example is a modification of the 'quickstartxmlbeans' sample supplied
with the software. I am using Axis2 1.1.1 and Java 1.6.0.

The schema in the wsdl:types section of the WSDL file is:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           attributeFormDefault="qualified"
elementFormDefault="qualified"
           targetNamespace="http://quickstart.samples/xsd">
  <xs:element name="attribute">
    <xs:complexType>
      <xs:attribute name="status" type="xs:string" />
      <xs:sequence>
        <xs:element name="value" nillable="true" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="attributeResponse">
    <xs:complexType>
      <xs:attribute name="status" type="xs:string" />
      <xs:sequence>
        <xs:element name="value" nillable="true" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

And the message/port definition is

<wsdl:message name="attributeMessage">
  <wsdl:part name="part1" element="ns:attribute"/>
</wsdl:message>
<wsdl:message name="attributeResponseMessage">
  <wsdl:part name="part1" element="ns:attributeResponse"/>
</wsdl:message>
<wsdl:portType name="MyServicePortType">
  <wsdl:operation name="attribute">
    <wsdl:input message="axis2:attributeMessage"/>
    <wsdl:output message="axis2:attributeResponseMessage"/>
  </wsdl:operation>
</wsdl:portType>

This defines a service whose request and response both contain an
attribute 'status' and an element 'value'.

The client sets the status attribute to "OK" and the value element to
"Testing" in the request. It calls the service and prints the status
attribute and value element that come back in the response.

    public static void attribute(MyServiceStub stub){
        try{
            AttributeDocument reqDoc =
AttributeDocument.Factory.newInstance();
            AttributeDocument.Attribute req = reqDoc.addNewAttribute();
            req.setStatus("OK");
            req.setValue("Testing");
            AttributeResponseDocument res = stub.attribute(reqDoc);
 
System.err.println("Status="+res.getAttributeResponse().getStatus());
 
System.err.println("Value="+res.getAttributeResponse().getValue());
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

The service just takes the status attrbiute and the value element from
the request and echos them back in the response.

    public AttributeResponseDocument attribute(AttributeDocument param1)
{
        String status = param1.getAttribute().getStatus();
        String value = param1.getAttribute().getValue();
        System.err.println();
        System.err.println("Status="+status);
        System.err.println("Value="+value);
        AttributeResponseDocument resDoc =
                AttributeResponseDocument.Factory.newInstance();
        AttributeResponseDocument.AttributeResponse res =
                resDoc.addNewAttributeResponse();
        res.setStatus(status);
        res.setValue(value);
        return resDoc;
    }

When I run the client I get the following output:

run.client:
     [java] Status=null
     [java] Value=Testing

The value element is correct, but the status attribute is null. A trace
on the server side shows the same problem. That is, after the request is
received on the server the status attribute is null.

I changed the status attribute to a status element and all was processed
fine, so the problem seems to be specific to XML attributes.

Is something extra needed when XML attributes are involved?

Thanks,
Paul Chisholm
Technology Support/TAS
Airservices Australia

www.airservicesaustralia.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CAUTION: This e-mail is confidential. If you are not the intended 
recipient, you must not disclose or use the information contained 
in it. If you have received this e-mail in error, please tell us
immediately by return e-mail and delete the document. 

Airservices Australia does not represent, warrant or guarantee 
that the integrity of this communication is free of errors, virus
or interference.

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


RE: XML attributes are null after transmission

Posted by "Chisholm, Paul" <Pa...@AirservicesAustralia.com>.
Dennis,

That did the trick. I'm not sure why I specified
attributeFormDefault="qualified", I possibly used another schema as a
starting point. I will enter a Jira as you request.

Thanks very much for your help.

Paul

-----Original Message-----
From: Dennis Sosnoski [mailto:dms@sosnoski.com] 
Sent: Thursday, 26 April 2007 12:47 PM
To: axis-user@ws.apache.org
Subject: Re: XML attributes are null after transmission

Not much else I can suggest, then, except to try capturing the exchange
with Tcpmon or something similar to see what's actually getting sent out
from each end.

I updated some of my performance test code to run with the 1.1.1 Axis2
release. This uses attributes pretty heavily, and it looks correct. 
Here's a sample of the actual XML:

      <soapenv:Body>
         <results xmlns="http://seismic.sosnoski.com/types" count="11">
            <result-set>
               <area-name>Alaska - Aleutian Arc</area-name>
               <regions count="1">
                  <region ident="rgn17" index="17">SOUTH OF
ALASKA</region>
               </regions>
               <quakes count="1">
                  <quake depth="10.0" latitude="54.594" 
longitude="-142.743" magnitude="5.2" method="MW" millis="2400" 
region="rgn17" time="2001-05-14T07:22:13.000Z" />
               </quakes>

Here's part of the corresponding schema from the WSDL:
  
   <complexType name="Region">
    <simpleContent>
     <extension base="xsd:string">
      <attribute name="ident" use="required" type="xsd:string"/>
      <attribute name="index" use="required" type="xsd:int"/>
     </extension>
    </simpleContent>
   </complexType>
  
   <complexType name="Quake">
    <attribute name="time" use="required" type="xsd:dateTime"/>
    <attribute name="millis" use="required" type="xsd:int"/>
    <attribute name="latitude" use="required" type="xsd:float"/>
    <attribute name="longitude" use="required" type="xsd:float"/>
    <attribute name="depth" use="required" type="xsd:float"/>
    <attribute name="magnitude" use="required" type="xsd:float"/>
    <attribute name="method" use="required" type="xsd:string"/>
    <attribute name="region" use="required" type="xsd:string"/>
   </complexType>
  
   <complexType name="QuakeSet">
    <sequence>
     <element name="area-name" type="xsd:string"/>
     <element name="regions">
      <complexType>
       <sequence>
        <element name="region" minOccurs="0" maxOccurs="unbounded" 
type="tns:Region"/>
       </sequence>
       <attribute name="count" use="required" type="xsd:int"/>
      </complexType>
     </element>
     <element name="quakes">
      <complexType>
       <sequence>
        <element name="quake" minOccurs="0" maxOccurs="unbounded" 
type="tns:Quake"/>
       </sequence>
       <attribute name="count" use="required" type="xsd:int"/>
      </complexType>
     </element>
    </sequence>
   </complexType>
  
   <element name="results">
    <complexType>
     <sequence>
      <element name="result-set" minOccurs="0" maxOccurs="unbounded" 
type="tns:QuakeSet"/>
     </sequence>
     <attribute name="count" use="required" type="xsd:int"/>
    </complexType>
   </element>

Though looking at your schema again, I see you're using
attributeFormDefault="qualified". This is generally not a good idea, and
because it's not widely used you may be running into some quirk as a
result. So try a capture to see what's going over the wire now, but then
try eliminating the attributeFormDefault and see what happens. If it
works with the attributeFormDefault removed please enter a Jira.

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz Seattle, WA
+1-425-939-0576 - Wellington, NZ +64-4-298-6117



Chisholm, Paul wrote:
> Dennis,
>
> Thanks for that info. My invalid schema does indeed process without 
> any complaint from WSDL2Java.
>
> I modified the schema as you suggested to
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>            attributeFormDefault="qualified"
>            elementFormDefault="qualified"
>            targetNamespace="http://quickstart.samples/xsd">
>   <xs:element name="attribute">
>     <xs:complexType>
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>       <xs:attribute name="status" type="xs:string" />
>     </xs:complexType>
>   </xs:element>
>   <xs:element name="attributeResponse">
>     <xs:complexType>
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>       <xs:attribute name="status" type="xs:string" />
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
>
> No luck unfortunately, the behaviour is exactly as before. The getter 
> for the XML attribute still returns null.
>
> Paul
>
> -----Original Message-----
> From: Dennis Sosnoski [mailto:dms@sosnoski.com]
> Sent: Thursday, 26 April 2007 10:43 AM
> To: axis-user@ws.apache.org
> Subject: Re: XML attributes are null after transmission
>
> Hi Paul,
>
> Your complexType definitions are invalid, which may be the cause of 
> the problem. Attribute declarations need to be after the <sequence> 
> element, not before it. I'm surprised you're able to run WSDL2Java 
> using this as input without getting an error message - sounds like the

> schema model needs some work on error checking.
>
>   - Dennis
>
> Dennis M. Sosnoski
> SOA and Web Services in Java
> Training and Consulting
> http://www.sosnoski.com - http://www.sosnoski.co.nz Seattle, WA
> +1-425-939-0576 - Wellington, NZ +64-4-298-6117
>
>
>
> Chisholm, Paul wrote:
>   
>> Hi,
>>
>> I am having a problem with data that is transferred via XML
>>     
> attributes.
>   
>> Namely, when an object is constructed after receiving a message the 
>> getter corresponding to an attribute returns null.
>>
>> I start with a WSDL file and use XMLBeans data binding. The following

>> example is a modification of the 'quickstartxmlbeans' sample supplied

>> with the software. I am using Axis2 1.1.1 and Java 1.6.0.
>>
>> The schema in the wsdl:types section of the WSDL file is:
>>
>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>            attributeFormDefault="qualified"
>> elementFormDefault="qualified"
>>            targetNamespace="http://quickstart.samples/xsd">
>>   <xs:element name="attribute">
>>     <xs:complexType>
>>       <xs:attribute name="status" type="xs:string" />
>>       <xs:sequence>
>>         <xs:element name="value" nillable="true" type="xs:string" />
>>       </xs:sequence>
>>     </xs:complexType>
>>   </xs:element>
>>   <xs:element name="attributeResponse">
>>     <xs:complexType>
>>       <xs:attribute name="status" type="xs:string" />
>>       <xs:sequence>
>>         <xs:element name="value" nillable="true" type="xs:string" />
>>       </xs:sequence>
>>     </xs:complexType>
>>   </xs:element>
>> </xs:schema>
>>
>> And the message/port definition is
>>
>> <wsdl:message name="attributeMessage">
>>   <wsdl:part name="part1" element="ns:attribute"/> </wsdl:message> 
>> <wsdl:message name="attributeResponseMessage">
>>   <wsdl:part name="part1" element="ns:attributeResponse"/> 
>> </wsdl:message> <wsdl:portType name="MyServicePortType">
>>   <wsdl:operation name="attribute">
>>     <wsdl:input message="axis2:attributeMessage"/>
>>     <wsdl:output message="axis2:attributeResponseMessage"/>
>>   </wsdl:operation>
>> </wsdl:portType>
>>
>> This defines a service whose request and response both contain an 
>> attribute 'status' and an element 'value'.
>>
>> The client sets the status attribute to "OK" and the value element to

>> "Testing" in the request. It calls the service and prints the status 
>> attribute and value element that come back in the response.
>>
>>     public static void attribute(MyServiceStub stub){
>>         try{
>>             AttributeDocument reqDoc = 
>> AttributeDocument.Factory.newInstance();
>>             AttributeDocument.Attribute req =
>>     
> reqDoc.addNewAttribute();
>   
>>             req.setStatus("OK");
>>             req.setValue("Testing");
>>             AttributeResponseDocument res = stub.attribute(reqDoc);
>>  
>> System.err.println("Status="+res.getAttributeResponse().getStatus());
>>  
>> System.err.println("Value="+res.getAttributeResponse().getValue());
>>         } catch(Exception e){
>>             e.printStackTrace();
>>             System.err.println("\n\n\n");
>>         }
>>     }
>>
>> The service just takes the status attrbiute and the value element 
>> from
>>     
>
>   
>> the request and echos them back in the response.
>>
>>     public AttributeResponseDocument attribute(AttributeDocument
>> param1) {
>>         String status = param1.getAttribute().getStatus();
>>         String value = param1.getAttribute().getValue();
>>         System.err.println();
>>         System.err.println("Status="+status);
>>         System.err.println("Value="+value);
>>         AttributeResponseDocument resDoc =
>>                 AttributeResponseDocument.Factory.newInstance();
>>         AttributeResponseDocument.AttributeResponse res =
>>                 resDoc.addNewAttributeResponse();
>>         res.setStatus(status);
>>         res.setValue(value);
>>         return resDoc;
>>     }
>>
>> When I run the client I get the following output:
>>
>> run.client:
>>      [java] Status=null
>>      [java] Value=Testing
>>
>> The value element is correct, but the status attribute is null. A 
>> trace on the server side shows the same problem. That is, after the 
>> request is received on the server the status attribute is null.
>>
>> I changed the status attribute to a status element and all was 
>> processed fine, so the problem seems to be specific to XML
attributes.
>>
>> Is something extra needed when XML attributes are involved?
>>
>> Thanks,
>> Paul Chisholm
>> Technology Support/TAS
>> Airservices Australia
>>
>> www.airservicesaustralia.com
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> CAUTION: This e-mail is confidential. If you are not the intended 
>> recipient, you must not disclose or use the information contained in 
>> it. If you have received this e-mail in error, please tell us 
>> immediately by return e-mail and delete the document.
>>
>> Airservices Australia does not represent, warrant or guarantee that 
>> the integrity of this communication is free of errors, virus or 
>> interference.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
>> For additional commands, e-mail: axis-user-help@ws.apache.org
>>
>>
>>   
>>     
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
>   

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


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


Re: XML attributes are null after transmission

Posted by Dennis Sosnoski <dm...@sosnoski.com>.
Not much else I can suggest, then, except to try capturing the exchange 
with Tcpmon or something similar to see what's actually getting sent out 
from each end.

I updated some of my performance test code to run with the 1.1.1 Axis2 
release. This uses attributes pretty heavily, and it looks correct. 
Here's a sample of the actual XML:

      <soapenv:Body>
         <results xmlns="http://seismic.sosnoski.com/types" count="11">
            <result-set>
               <area-name>Alaska - Aleutian Arc</area-name>
               <regions count="1">
                  <region ident="rgn17" index="17">SOUTH OF ALASKA</region>
               </regions>
               <quakes count="1">
                  <quake depth="10.0" latitude="54.594" 
longitude="-142.743" magnitude="5.2" method="MW" millis="2400" 
region="rgn17" time="2001-05-14T07:22:13.000Z" />
               </quakes>

Here's part of the corresponding schema from the WSDL:
  
   <complexType name="Region">
    <simpleContent>
     <extension base="xsd:string">
      <attribute name="ident" use="required" type="xsd:string"/>
      <attribute name="index" use="required" type="xsd:int"/>
     </extension>
    </simpleContent>
   </complexType>
  
   <complexType name="Quake">
    <attribute name="time" use="required" type="xsd:dateTime"/>
    <attribute name="millis" use="required" type="xsd:int"/>
    <attribute name="latitude" use="required" type="xsd:float"/>
    <attribute name="longitude" use="required" type="xsd:float"/>
    <attribute name="depth" use="required" type="xsd:float"/>
    <attribute name="magnitude" use="required" type="xsd:float"/>
    <attribute name="method" use="required" type="xsd:string"/>
    <attribute name="region" use="required" type="xsd:string"/>
   </complexType>
  
   <complexType name="QuakeSet">
    <sequence>
     <element name="area-name" type="xsd:string"/>
     <element name="regions">
      <complexType>
       <sequence>
        <element name="region" minOccurs="0" maxOccurs="unbounded" 
type="tns:Region"/>
       </sequence>
       <attribute name="count" use="required" type="xsd:int"/>
      </complexType>
     </element>
     <element name="quakes">
      <complexType>
       <sequence>
        <element name="quake" minOccurs="0" maxOccurs="unbounded" 
type="tns:Quake"/>
       </sequence>
       <attribute name="count" use="required" type="xsd:int"/>
      </complexType>
     </element>
    </sequence>
   </complexType>
  
   <element name="results">
    <complexType>
     <sequence>
      <element name="result-set" minOccurs="0" maxOccurs="unbounded" 
type="tns:QuakeSet"/>
     </sequence>
     <attribute name="count" use="required" type="xsd:int"/>
    </complexType>
   </element>

Though looking at your schema again, I see you're using 
attributeFormDefault="qualified". This is generally not a good idea, and 
because it's not widely used you may be running into some quirk as a 
result. So try a capture to see what's going over the wire now, but then 
try eliminating the attributeFormDefault and see what happens. If it 
works with the attributeFormDefault removed please enter a Jira.

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117



Chisholm, Paul wrote:
> Dennis,
>
> Thanks for that info. My invalid schema does indeed process without any
> complaint from WSDL2Java.
>
> I modified the schema as you suggested to 
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>            attributeFormDefault="qualified"
>            elementFormDefault="qualified"
>            targetNamespace="http://quickstart.samples/xsd">
>   <xs:element name="attribute">
>     <xs:complexType>
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>       <xs:attribute name="status" type="xs:string" />
>     </xs:complexType>
>   </xs:element>
>   <xs:element name="attributeResponse">
>     <xs:complexType>
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>       <xs:attribute name="status" type="xs:string" />
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
>
> No luck unfortunately, the behaviour is exactly as before. The getter
> for the XML attribute still returns null.
>
> Paul
>
> -----Original Message-----
> From: Dennis Sosnoski [mailto:dms@sosnoski.com] 
> Sent: Thursday, 26 April 2007 10:43 AM
> To: axis-user@ws.apache.org
> Subject: Re: XML attributes are null after transmission
>
> Hi Paul,
>
> Your complexType definitions are invalid, which may be the cause of the
> problem. Attribute declarations need to be after the <sequence> element,
> not before it. I'm surprised you're able to run WSDL2Java using this as
> input without getting an error message - sounds like the schema model
> needs some work on error checking.
>
>   - Dennis
>
> Dennis M. Sosnoski
> SOA and Web Services in Java
> Training and Consulting
> http://www.sosnoski.com - http://www.sosnoski.co.nz Seattle, WA
> +1-425-939-0576 - Wellington, NZ +64-4-298-6117
>
>
>
> Chisholm, Paul wrote:
>   
>> Hi,
>>
>> I am having a problem with data that is transferred via XML
>>     
> attributes.
>   
>> Namely, when an object is constructed after receiving a message the 
>> getter corresponding to an attribute returns null.
>>
>> I start with a WSDL file and use XMLBeans data binding. The following 
>> example is a modification of the 'quickstartxmlbeans' sample supplied 
>> with the software. I am using Axis2 1.1.1 and Java 1.6.0.
>>
>> The schema in the wsdl:types section of the WSDL file is:
>>
>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>            attributeFormDefault="qualified"
>> elementFormDefault="qualified"
>>            targetNamespace="http://quickstart.samples/xsd">
>>   <xs:element name="attribute">
>>     <xs:complexType>
>>       <xs:attribute name="status" type="xs:string" />
>>       <xs:sequence>
>>         <xs:element name="value" nillable="true" type="xs:string" />
>>       </xs:sequence>
>>     </xs:complexType>
>>   </xs:element>
>>   <xs:element name="attributeResponse">
>>     <xs:complexType>
>>       <xs:attribute name="status" type="xs:string" />
>>       <xs:sequence>
>>         <xs:element name="value" nillable="true" type="xs:string" />
>>       </xs:sequence>
>>     </xs:complexType>
>>   </xs:element>
>> </xs:schema>
>>
>> And the message/port definition is
>>
>> <wsdl:message name="attributeMessage">
>>   <wsdl:part name="part1" element="ns:attribute"/> </wsdl:message> 
>> <wsdl:message name="attributeResponseMessage">
>>   <wsdl:part name="part1" element="ns:attributeResponse"/> 
>> </wsdl:message> <wsdl:portType name="MyServicePortType">
>>   <wsdl:operation name="attribute">
>>     <wsdl:input message="axis2:attributeMessage"/>
>>     <wsdl:output message="axis2:attributeResponseMessage"/>
>>   </wsdl:operation>
>> </wsdl:portType>
>>
>> This defines a service whose request and response both contain an 
>> attribute 'status' and an element 'value'.
>>
>> The client sets the status attribute to "OK" and the value element to 
>> "Testing" in the request. It calls the service and prints the status 
>> attribute and value element that come back in the response.
>>
>>     public static void attribute(MyServiceStub stub){
>>         try{
>>             AttributeDocument reqDoc = 
>> AttributeDocument.Factory.newInstance();
>>             AttributeDocument.Attribute req =
>>     
> reqDoc.addNewAttribute();
>   
>>             req.setStatus("OK");
>>             req.setValue("Testing");
>>             AttributeResponseDocument res = stub.attribute(reqDoc);
>>  
>> System.err.println("Status="+res.getAttributeResponse().getStatus());
>>  
>> System.err.println("Value="+res.getAttributeResponse().getValue());
>>         } catch(Exception e){
>>             e.printStackTrace();
>>             System.err.println("\n\n\n");
>>         }
>>     }
>>
>> The service just takes the status attrbiute and the value element from
>>     
>
>   
>> the request and echos them back in the response.
>>
>>     public AttributeResponseDocument attribute(AttributeDocument 
>> param1) {
>>         String status = param1.getAttribute().getStatus();
>>         String value = param1.getAttribute().getValue();
>>         System.err.println();
>>         System.err.println("Status="+status);
>>         System.err.println("Value="+value);
>>         AttributeResponseDocument resDoc =
>>                 AttributeResponseDocument.Factory.newInstance();
>>         AttributeResponseDocument.AttributeResponse res =
>>                 resDoc.addNewAttributeResponse();
>>         res.setStatus(status);
>>         res.setValue(value);
>>         return resDoc;
>>     }
>>
>> When I run the client I get the following output:
>>
>> run.client:
>>      [java] Status=null
>>      [java] Value=Testing
>>
>> The value element is correct, but the status attribute is null. A 
>> trace on the server side shows the same problem. That is, after the 
>> request is received on the server the status attribute is null.
>>
>> I changed the status attribute to a status element and all was 
>> processed fine, so the problem seems to be specific to XML attributes.
>>
>> Is something extra needed when XML attributes are involved?
>>
>> Thanks,
>> Paul Chisholm
>> Technology Support/TAS
>> Airservices Australia
>>
>> www.airservicesaustralia.com
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> CAUTION: This e-mail is confidential. If you are not the intended 
>> recipient, you must not disclose or use the information contained in 
>> it. If you have received this e-mail in error, please tell us 
>> immediately by return e-mail and delete the document.
>>
>> Airservices Australia does not represent, warrant or guarantee that 
>> the integrity of this communication is free of errors, virus or 
>> interference.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
>> For additional commands, e-mail: axis-user-help@ws.apache.org
>>
>>
>>   
>>     
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
>   

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


RE: XML attributes are null after transmission

Posted by "Chisholm, Paul" <Pa...@AirservicesAustralia.com>.
Dennis,

Thanks for that info. My invalid schema does indeed process without any
complaint from WSDL2Java.

I modified the schema as you suggested to 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           attributeFormDefault="qualified"
           elementFormDefault="qualified"
           targetNamespace="http://quickstart.samples/xsd">
  <xs:element name="attribute">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="value" nillable="true" type="xs:string" />
      </xs:sequence>
      <xs:attribute name="status" type="xs:string" />
    </xs:complexType>
  </xs:element>
  <xs:element name="attributeResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="value" nillable="true" type="xs:string" />
      </xs:sequence>
      <xs:attribute name="status" type="xs:string" />
    </xs:complexType>
  </xs:element>
</xs:schema>

No luck unfortunately, the behaviour is exactly as before. The getter
for the XML attribute still returns null.

Paul

-----Original Message-----
From: Dennis Sosnoski [mailto:dms@sosnoski.com] 
Sent: Thursday, 26 April 2007 10:43 AM
To: axis-user@ws.apache.org
Subject: Re: XML attributes are null after transmission

Hi Paul,

Your complexType definitions are invalid, which may be the cause of the
problem. Attribute declarations need to be after the <sequence> element,
not before it. I'm surprised you're able to run WSDL2Java using this as
input without getting an error message - sounds like the schema model
needs some work on error checking.

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz Seattle, WA
+1-425-939-0576 - Wellington, NZ +64-4-298-6117



Chisholm, Paul wrote:
> Hi,
>
> I am having a problem with data that is transferred via XML
attributes.
> Namely, when an object is constructed after receiving a message the 
> getter corresponding to an attribute returns null.
>
> I start with a WSDL file and use XMLBeans data binding. The following 
> example is a modification of the 'quickstartxmlbeans' sample supplied 
> with the software. I am using Axis2 1.1.1 and Java 1.6.0.
>
> The schema in the wsdl:types section of the WSDL file is:
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>            attributeFormDefault="qualified"
> elementFormDefault="qualified"
>            targetNamespace="http://quickstart.samples/xsd">
>   <xs:element name="attribute">
>     <xs:complexType>
>       <xs:attribute name="status" type="xs:string" />
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>     </xs:complexType>
>   </xs:element>
>   <xs:element name="attributeResponse">
>     <xs:complexType>
>       <xs:attribute name="status" type="xs:string" />
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
>
> And the message/port definition is
>
> <wsdl:message name="attributeMessage">
>   <wsdl:part name="part1" element="ns:attribute"/> </wsdl:message> 
> <wsdl:message name="attributeResponseMessage">
>   <wsdl:part name="part1" element="ns:attributeResponse"/> 
> </wsdl:message> <wsdl:portType name="MyServicePortType">
>   <wsdl:operation name="attribute">
>     <wsdl:input message="axis2:attributeMessage"/>
>     <wsdl:output message="axis2:attributeResponseMessage"/>
>   </wsdl:operation>
> </wsdl:portType>
>
> This defines a service whose request and response both contain an 
> attribute 'status' and an element 'value'.
>
> The client sets the status attribute to "OK" and the value element to 
> "Testing" in the request. It calls the service and prints the status 
> attribute and value element that come back in the response.
>
>     public static void attribute(MyServiceStub stub){
>         try{
>             AttributeDocument reqDoc = 
> AttributeDocument.Factory.newInstance();
>             AttributeDocument.Attribute req =
reqDoc.addNewAttribute();
>             req.setStatus("OK");
>             req.setValue("Testing");
>             AttributeResponseDocument res = stub.attribute(reqDoc);
>  
> System.err.println("Status="+res.getAttributeResponse().getStatus());
>  
> System.err.println("Value="+res.getAttributeResponse().getValue());
>         } catch(Exception e){
>             e.printStackTrace();
>             System.err.println("\n\n\n");
>         }
>     }
>
> The service just takes the status attrbiute and the value element from

> the request and echos them back in the response.
>
>     public AttributeResponseDocument attribute(AttributeDocument 
> param1) {
>         String status = param1.getAttribute().getStatus();
>         String value = param1.getAttribute().getValue();
>         System.err.println();
>         System.err.println("Status="+status);
>         System.err.println("Value="+value);
>         AttributeResponseDocument resDoc =
>                 AttributeResponseDocument.Factory.newInstance();
>         AttributeResponseDocument.AttributeResponse res =
>                 resDoc.addNewAttributeResponse();
>         res.setStatus(status);
>         res.setValue(value);
>         return resDoc;
>     }
>
> When I run the client I get the following output:
>
> run.client:
>      [java] Status=null
>      [java] Value=Testing
>
> The value element is correct, but the status attribute is null. A 
> trace on the server side shows the same problem. That is, after the 
> request is received on the server the status attribute is null.
>
> I changed the status attribute to a status element and all was 
> processed fine, so the problem seems to be specific to XML attributes.
>
> Is something extra needed when XML attributes are involved?
>
> Thanks,
> Paul Chisholm
> Technology Support/TAS
> Airservices Australia
>
> www.airservicesaustralia.com
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> CAUTION: This e-mail is confidential. If you are not the intended 
> recipient, you must not disclose or use the information contained in 
> it. If you have received this e-mail in error, please tell us 
> immediately by return e-mail and delete the document.
>
> Airservices Australia does not represent, warrant or guarantee that 
> the integrity of this communication is free of errors, virus or 
> interference.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
>   

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


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


Re: XML attributes are null after transmission

Posted by Dennis Sosnoski <dm...@sosnoski.com>.
Hi Paul,

Your complexType definitions are invalid, which may be the cause of the 
problem. Attribute declarations need to be after the <sequence> element, 
not before it. I'm surprised you're able to run WSDL2Java using this as 
input without getting an error message - sounds like the schema model 
needs some work on error checking.

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117



Chisholm, Paul wrote:
> Hi,
>
> I am having a problem with data that is transferred via XML attributes.
> Namely, when an object is constructed after receiving a message the
> getter corresponding to an attribute returns null.
>
> I start with a WSDL file and use XMLBeans data binding. The following
> example is a modification of the 'quickstartxmlbeans' sample supplied
> with the software. I am using Axis2 1.1.1 and Java 1.6.0.
>
> The schema in the wsdl:types section of the WSDL file is:
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>            attributeFormDefault="qualified"
> elementFormDefault="qualified"
>            targetNamespace="http://quickstart.samples/xsd">
>   <xs:element name="attribute">
>     <xs:complexType>
>       <xs:attribute name="status" type="xs:string" />
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>     </xs:complexType>
>   </xs:element>
>   <xs:element name="attributeResponse">
>     <xs:complexType>
>       <xs:attribute name="status" type="xs:string" />
>       <xs:sequence>
>         <xs:element name="value" nillable="true" type="xs:string" />
>       </xs:sequence>
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
>
> And the message/port definition is
>
> <wsdl:message name="attributeMessage">
>   <wsdl:part name="part1" element="ns:attribute"/>
> </wsdl:message>
> <wsdl:message name="attributeResponseMessage">
>   <wsdl:part name="part1" element="ns:attributeResponse"/>
> </wsdl:message>
> <wsdl:portType name="MyServicePortType">
>   <wsdl:operation name="attribute">
>     <wsdl:input message="axis2:attributeMessage"/>
>     <wsdl:output message="axis2:attributeResponseMessage"/>
>   </wsdl:operation>
> </wsdl:portType>
>
> This defines a service whose request and response both contain an
> attribute 'status' and an element 'value'.
>
> The client sets the status attribute to "OK" and the value element to
> "Testing" in the request. It calls the service and prints the status
> attribute and value element that come back in the response.
>
>     public static void attribute(MyServiceStub stub){
>         try{
>             AttributeDocument reqDoc =
> AttributeDocument.Factory.newInstance();
>             AttributeDocument.Attribute req = reqDoc.addNewAttribute();
>             req.setStatus("OK");
>             req.setValue("Testing");
>             AttributeResponseDocument res = stub.attribute(reqDoc);
>  
> System.err.println("Status="+res.getAttributeResponse().getStatus());
>  
> System.err.println("Value="+res.getAttributeResponse().getValue());
>         } catch(Exception e){
>             e.printStackTrace();
>             System.err.println("\n\n\n");
>         }
>     }
>
> The service just takes the status attrbiute and the value element from
> the request and echos them back in the response.
>
>     public AttributeResponseDocument attribute(AttributeDocument param1)
> {
>         String status = param1.getAttribute().getStatus();
>         String value = param1.getAttribute().getValue();
>         System.err.println();
>         System.err.println("Status="+status);
>         System.err.println("Value="+value);
>         AttributeResponseDocument resDoc =
>                 AttributeResponseDocument.Factory.newInstance();
>         AttributeResponseDocument.AttributeResponse res =
>                 resDoc.addNewAttributeResponse();
>         res.setStatus(status);
>         res.setValue(value);
>         return resDoc;
>     }
>
> When I run the client I get the following output:
>
> run.client:
>      [java] Status=null
>      [java] Value=Testing
>
> The value element is correct, but the status attribute is null. A trace
> on the server side shows the same problem. That is, after the request is
> received on the server the status attribute is null.
>
> I changed the status attribute to a status element and all was processed
> fine, so the problem seems to be specific to XML attributes.
>
> Is something extra needed when XML attributes are involved?
>
> Thanks,
> Paul Chisholm
> Technology Support/TAS
> Airservices Australia
>
> www.airservicesaustralia.com
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> CAUTION: This e-mail is confidential. If you are not the intended 
> recipient, you must not disclose or use the information contained 
> in it. If you have received this e-mail in error, please tell us
> immediately by return e-mail and delete the document. 
>
> Airservices Australia does not represent, warrant or guarantee 
> that the integrity of this communication is free of errors, virus
> or interference.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
>   

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