----- Original Message -----
Sent: Wednesday, February 16, 2005
12:39p
Subject: Re: array of recursive
beans (doc/literal style)
Thanks for the response Dino.
I am using Axis rc1.2 nightly build from
Feb 8th.
I think you are right regarding desinging
the interfaces. Its better to work on WSDL and schema before
working on java code but I have all the java classes built. These are
not new services. I have all these services for long time and everything
was working great until I moved to doc/literal style. I was using
rpc/encoded style before.
I looked at the WSDL generated by Axis and
it looked fine to me. May be somone can look at my WSDL and see where it
is wrong. Two elements that need to look at are:
<complexType name="ArrayOf_tns1_ContainerBean">
<sequence>
<element maxOccurs="unbounded"
minOccurs="0"
name="item"
type="tns1:ContainerBean" />
</sequence>
</complexType>
AND
<element name="getRootContainersResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded"
name="item"
type="tns1:ContainerBean" />
</sequence>
</complexType>
</element>
Both have the right definitions for array
of beans. Looks like getRootContainerResponse defines namespace properly
but not the ArrayOf_tns1_ContainerBean (look at the soap response
file).
Also, I am attaching the soap response. It
looks like the problem is due to the namespace of each array
element.Namespaces are defined properly for the top level elements
array but for the recursive elements, namespace is
empty.
Any help is appreciated.
Thanks
Praveen
----- Original Message -----
Sent: Wednesday, February 16,
2005 11:59 AM
Subject: RE: array of recursive
beans (doc/literal style)
Is this a v1.2 RC thing, or are you
using AXIS v1.1?
And,
how are you designing the interface?
There is a line of thinking that
says, if you want interop, then start by designing the interface in a
platform-independent manner. In other words, WSDL and W3C XML
Schema. This applies whether you are using AXIS, .NET, or
something else. Some people call this "contract first" or
"schema-first design".
Schema-first design is a hassle you
don't need if you are doing like-to-like communications. So
don't do it. AXIS-to-AXIS is easy.
.NET-to-.NET is easy. Just define your Interface in actual
code (write your Java interface), specify some magic in the WSDD, and
boom, you can connect.
It's when you want to mix and match
clients and servers that this approach falls down. Simple
cases are ok, but nested arrays and structs don't work. In
other words, starting with a .net server-side class and expecting
the dynamically-generated WSDL to give good interop with an AXIS
client, is wishful thinking. Likewise for the converse. or any
other combination of unlike webservices
stacks.
It sounds like you started with a
Java class, and you are using Java2WSDL on it. I would suggest
that you start with the schema and WSDL, then generate the server-side
Java interfaces and support classes with WSDL2Java. Then provide
the server-side implementations. You may need adapters between
the classes generated from the schema, and the existing
application on the server side.
Likewise, generate the .NET
(client-side) proxies from the WSDL.
-Dino
MS
I have a method getRootContainers that
returns array of ContainerBean[]. Each ContainerBean has reference to
an array of child ContainerBean[]. With Eugene's help I could make the
array stuff work. the method sucessfully returns the array of
COntainerBean[] and .NET reads it fine. But .NET client doesn't read
them recursively. It only build the top level array fine but each
ContainerBean has array of other ContainerBean. My service in wsdd
looks as follows:
<service name="CMISOAPContainerService" provider="java:RPC"
style="wrapped" use="literal">
<parameter name="allowedMethods" value="copyContainer
createContainer deleteContainer getContainer getContainerIcon
getContainerProperties getRootContainers getContainerObjects
getContentObjectsForContainer getRootContainers moveContainer
updateContainer createQueryContainer updateQueryContainer
createTaxonomy"/>
<parameter name="scope" value="session"/>
<parameter name="className"
value="com.contextmedia.ip.session.soap.CMISOAPContainerService"/>
<operation name="getRootContainers" qname="ns:getRootContainers"
xmlns:ns="http://soap.session.ip.contextmedia.com"
returnQName="ns:item" returnType="ns:ContainerBean[]" >
<parameter name="depth" qname="ns:depth"
type="xsd:int" mode="IN" />
</operation>
<typemapping
languageSpecificType="java:com.contextmedia.ip.session.soap.ContainerBean[]"
qname="soapenc:Array"
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
encodingStyle=""
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"/>
<beanMapping qname="bean:ContainerBean"
xmlns:bean="http://soap.session.ip.contextmedia.com"
languageSpecificType="java:com.contextmedia.ip.session.soap.ContainerBean"/>
</service>
I had to add <operation> and
<typeMapping> tags after seeing Eugene's sample. w/o those two
tags, even the first level of ContainerBean[] was not
working.
Not sure what else I am missing, How do I
make the recursive bean stuff work? Is there any special configuration
in WSDD file to make array of recursive beans work.
Thanks,
Praveen
**************************************************************
Praveen Peddi
Sr Software Engg, Context Media, Inc.
email:[EMAIL PROTECTED]
Tel: 401.854.3475
Fax: 401.861.3596
web: http://www.contextmedia.com
**************************************************************
Context Media- "The Leader in Enterprise Content Integration"