axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From todd runstein <todd_...@yahoo.com>
Subject Odd nesting when using arrays
Date Thu, 27 Oct 2005 18:34:00 GMT
I'm concerned that using an array of objects creates a
service that is too "axis specific".  Or, perhaps I'm
not creating my service correctly.  In either case,
any information or suggestions on the following would
be greatly appreciated.

Consider this simple service.  A Parent class contains
an array of Child objects.  Given this class, I would
expect the client to create a message that looks like:
       <soapenv:Body>
         <combinedAges xmlns="Family.Service">
            <parent xmlns="">
               <children>
                  <age>4</age>
               </children>
               <children>
                  <age>5</age>
               </children>
               ......

But the client instead generates this (notice how the
children tags are nested in a children tag):
      <soapenv:Body>
         <combinedAges xmlns="Family.Service">
            <parent xmlns="">
               <children>
                  <children>
                     <age>4</age>
                  </children>
                  <children>
                     <age>5</age>
                  </children>
                  ......
                </children> 

While both my axis client and service understand this,
 I'm concerned that non-axis clients won't work.  Are
my concerns unfounded?  Or is this happening because I
haven't built or defined the service correctly?

I'm including the wsdl, the wsdd, code, request and
response.  Sorry if this is too much - I'd rather be
complete than leave out an important detail.

WSDL:
-
	<wsdl:definitions
targetNamespace="http://localhost:8080/bc_webservice/services/FamilyService">
-
	<!--
WSDL created by Apache Axis version: 1.2.1
Built on Oct 27, 2005 (09:15:57 EDT)
-->
-
	<wsdl:types>
-
	<schema targetNamespace="urn:FamilyService">
<import
namespace="http://localhost:8080/bc_webservice/services/FamilyService"/>
<import
namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
	<complexType name="Child">
-
	<sequence>
<element name="age" type="xsd:int"/>
</sequence>
</complexType>
-
	<complexType name="Parent">
-
	<sequence>
<element name="children" nillable="true"
type="impl:ArrayOf_tns1_Child"/>
<element name="name" nillable="true"
type="xsd:string"/>
</sequence>
</complexType>
</schema>
-
	<schema
targetNamespace="http://localhost:8080/bc_webservice/services/FamilyService">
<import namespace="urn:FamilyService"/>
<import
namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
	<complexType name="ArrayOf_tns1_Child">
-
	<complexContent>
-
	<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType"
wsdl:arrayType="tns1:Child[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
-
	<wsdl:message name="combinedAgesRequest">
<wsdl:part name="parent" type="tns1:Parent"/>
</wsdl:message>
-
	<wsdl:message name="combinedAgesResponse">
<wsdl:part name="combinedAgesReturn" type="xsd:int"/>
</wsdl:message>
-
	<wsdl:portType name="FamilyService">
-
	<wsdl:operation name="combinedAges"
parameterOrder="parent">
<wsdl:input message="impl:combinedAgesRequest"
name="combinedAgesRequest"/>
<wsdl:output message="impl:combinedAgesResponse"
name="combinedAgesResponse"/>
</wsdl:operation>
</wsdl:portType>
-
	<wsdl:binding name="FamilyServiceSoapBinding"
type="impl:FamilyService">
<wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
-
	<wsdl:operation name="combinedAges">
<wsdlsoap:operation soapAction=""/>
-
	<wsdl:input name="combinedAgesRequest">
<wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://webservices.msei.com"
use="encoded"/>
</wsdl:input>
-
	<wsdl:output name="combinedAgesResponse">
<wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost:8080/bc_webservice/services/FamilyService"
use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
-
	<wsdl:service name="FamilyServiceService">
-
	<wsdl:port binding="impl:FamilyServiceSoapBinding"
name="FamilyService">
<wsdlsoap:address
location="http://localhost:8080/bc_webservice/services/FamilyService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>


WSDD:
<service name="FamilyService" provider="java:RPC">
 	<parameter name="allowedMethods" value="*" />
 	<parameter name="className"
value="com.msei.webservices.FamilyService" />
 	<beanMapping qname="ns:Child"
xmlns:ns="urn:FamilyService"
 	
languageSpecificType="java:com.msei.webservices.typemapping.Child"
/>
 	<beanMapping qname="ns:Parent"
xmlns:ns="urn:FamilyService"
 	
languageSpecificType="java:com.msei.webservices.typemapping.Parent"
/>
 </service>


CODE - Service:
public class Parent {
    private String name;
    private Child[] children;
...standard bean...
}

public class Child{
    private int age;
...standard bean...
}

public class FamilyService{
     public Integer combinedAges(Parent parent){
        int retVal = 0;
        
        Child[] children = parent.getChildren();
        if (children!=null){
            for(int x=0;x<children.length;x++){
                retVal += children[x].getAge();
            }
        }
        
        return new Integer(retVal);
    }
}

CODE - Client:
public class FamilyClient{
    public static void main(String[] args){
        try {
            String endpointURL = options.getURL();
            endpointURL =
"http://localhost:5555/bc_webservice/services/FamilyService";
                      
            Parent parent = new Parent();
            parent.setName("Big Daddy");
            Child joey = new Child();
            joey.setAge(4);
            Child suzie = new Child();
            suzie.setAge(5);
            Child stevie = new Child();
            stevie.setAge(7);
            parent.setChildren(new
Child[]{joey,suzie,stevie});
            
            Service  service = new Service();
            Call     call    = (Call)
service.createCall();
            
            QName soapns = new
QName("TheFamily","Family.Service");
            
            call.setTargetEndpointAddress( new
java.net.URL(endpointURL) );
            call.setOperation(soapns, new
QName("Family.Service", "combinedAges") );
           
call.setProperty(Call.SEND_TYPE_ATTR,Boolean.FALSE);
                         
            call.setOperationStyle(Style.WRAPPED);
            
            QName pName = new
QName("urn:Family","parent");
          
call.registerTypeMapping(Parent.class,pName,
                    new
BeanSerializerFactory(Parent.class,pName),
                    new
BeanDeserializerFactory(Parent.class,pName));
            
            QName cName = new
QName("urn:Family","children");
           
call.registerTypeMapping(Child.class,cName,
                    new
BeanSerializerFactory(Child.class,cName),
                    new
BeanDeserializerFactory(Child.class,cName));
                                   
call.addParameter("parent",pName,ParameterMode.IN);
                                              
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);
            
            Integer ret = (Integer) call.invoke( new
Object[] { parent } );
            
            System.out.println("Returned : " + ret);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}


REQUEST:
<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
         <combinedAges xmlns="Family.Service">
            <parent xmlns="">
               <children>
                  <children>
                     <age>4</age>
                  </children>
                  <children>
                     <age>5</age>
                  </children>
                  <children>
                     <age>7</age>
                  </children>
               </children>
               <name>Big Daddy</name>
            </parent>
         </combinedAges>
      </soapenv:Body>
   </soapenv:Envelope>


RESPONSE:
<?xml version="1.0" encoding="utf-8"?>
   <soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
         <ns1:combinedAgesResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="Family.Service">
            <combinedAgesReturn
xsi:type="xsd:int">16</combinedAgesReturn>
         </ns1:combinedAgesResponse>
      </soapenv:Body>
   </soapenv:Envelope>


The only "dumb question" is the one you were too afraid to ask.
________________________________________
Check out RouteRuler - Free software for runners, cyclists, walkers, etc.
http://routeruler.sourceforge.net
________________________________________
Get a handle on your data with "pocOLAP", the "little" OLAP project
http://pocolap.sourceforge.net
________________________________________


		
__________________________________ 
Yahoo! FareChase: Search multiple travel sites in one click.
http://farechase.yahoo.com

Mime
View raw message