Anne,
First, I appreciate the time you take to help. Thank you.
Can you indulge me a bit more. I think I followed your instructions
accurately. But I'm getting errors still.
I am looking at my WSDL and not sure it's correct based on your
last email.
My interface is "Session". My implementing class is "PlayerSession".
In both files I define this method:
public Session testSessionReturn()
Here is my WSDD file:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="disSessionManagement" provider="java:RPC">
<parameter name="className"
value="disney.dis.session.SessionManager"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="application"/>
<beanMapping qname="ns:Session" xmlns:ns="disney.dis.session"
languageSpecificType="java:disney.dis.session.Session"/>
</service>
</deployment>
I added the "beanMapping" construct. I deployed this via:
$ java org.apache.axis.client.AdminClient disSessionDeploy.wsdd
Processing file disSessionDeploy.wsdd
<Admin>Done processing</Admin>
$
Here is the beginning of my wsdl when I go to
http://localhost:8080/..../?wsdl
<wsdl:types>
<schema targetNamespace="disney.dis.session">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType abstract="true" name="Session">
<sequence>
<element name="context" nillable="true" type="xsd:string"/>
<element name="creationTime" nillable="true"
type="xsd:dateTime"/>
<element name="expirationTime" nillable="true"
type="xsd:dateTime"/>
<element name="productId" nillable="true" type="xsd:string"/>
<element name="sessionId" type="xsd:int"/>
<element name="uid" type="xsd:int"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
The return message is:
<wsdl:message name="testSessionReturnResponse">
<wsdl:part name="testSessionReturnReturn" type="tns1:Session"/>
</wsdl:message>
Under <wsdl:portType name="SessionManager"> I have this:
<wsdl:operation name="testSessionReturn">
<wsdl:input message="impl:testSessionReturnRequest"
name="testSessionReturnRequest"/>
<wsdl:output message="impl:testSessionReturnResponse"
name="testSessionReturnResponse"/>
</wsdl:operation>
Is it correct that the targetNamespace is "disney.dis.session"?
Should it be reversed as you wrote in your email
(http://session.dis.disney)? Or, do _I_ need to specify it in
reverse order in my WSDD file?
Does it matter as long as it matches whatever is I specify as
the URI in my QName?
Must the namespace name reflect any actual package name?
Here is my client code:
void testSessionReturn()
{
try
{
String namespaceURI = "http://disney.dis.session";
String localPart = "testSessionReturn";
ServiceFactory serviceFactory = ServiceFactory.newInstance();
QName serviceQName = new QName(namespaceURI, localPart);
Service service = serviceFactory.createService(serviceQName);
QName portName = new QName(sessionEndpoint);
Call call = (org.apache.axis.client.Call)
service.createCall(portName, localPart);
URL endpointURL = new URL(sessionEndpoint);
call.setOperationName("testSessionReturn");
call.setTargetEndpointAddress(endpointURL);
Class cl = Class.forName("disney.dis.session.Session");
QName className = new QName("disney.dis.session.Session");
BeanSerializerFactory bsf =
new BeanSerializerFactory(cl, className);
BeanDeserializerFactory bdf =
new BeanDeserializerFactory(cl, className);
call.registerTypeMapping(cl, className, bsf, bdf);
System.out.println("testSessionReturn5");
call.invoke();
System.out.println("testSessionReturn6");
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
I get the following error:
; nested exception is:
java.lang.NullPointerException
$
I need to get log4j working on my client so I can see errors from
the AXIS libs.
But I'm wondering what is basically wrong with the way I set up
my call, specify my QName's and so forth.
Many thanks to anyone who has ideas.
Vartan
--- Anne Thomas Manes <[EMAIL PROTECTED]> wrote:
> Vartan,
>
> The QName is not the name of the class. As I replied to you yesterday,
> a
> QName is a qualified name (in XML) that has two parts. The first part
> is a
> namespace (a URI), the second part is the local name ("Session"). In
> your
> particular case, the QName refers to the XML type of your return value.
> The
> XML type information is specified in the WSDL (and the WSDD if the
> service
> is built with Axis). For example, (assuming that you are using
> RPC/encoded,
> which is the default in Axis) the WSDL would define your return message
> as:
>
> <wsdl:message name="SessionResponse>
> <wsdl:part name="session" type="impl:Session"/>
> </wsdl:message>
>
> In this case, the type QName is "impl"Session". (The structure of the
> "impl:Session" type should be defined in the <wsdl:types> section using
> XML
> Schema.) The "impl" prefix refers to your WSDL targetNamespace. Given
> your
> package name, I would guess that the namespace URI is "
> http://session.dis.disney", but I suggest you verify that.
>
> If you are using RPC/encoded (the default) then the XML type
> information is
> also specified on the wire. For example, your return message will
> include
> something like this:
> <ns1:Return xmlns:ns1="http://session.dis.disney">
> <session xsi:type="ns1:Session">[session-data]</Session>
> </ns1:Return>
>
> In this example, the XML type is "http://session.dis.disney}Session"
> (you
> must map the "ns1" prefix to the actual namespace URI), and your Java
> QName
> would be defined like this:
>
> new QName ("http://session.dis.disney", "Session")
>
> See
>
http://java.sun.com/webservices/docs/1.6/api/javax/xml/namespace/QName.html)
>
> for more information about the Java QName class.
>
> Note -- you cannot use the JWS deployment method if you are returning a
> ValueType rather than a primitive type. You must use the WSDD method.
>
> Anne
>
> On 4/13/06, Rhimbo <[EMAIL PROTECTED]> wrote:
> >
> > Could someone tell me what are the QName arguments to the
> > BeanSerializerFactory and BeanDeserializerFactory constructors?
> >
> > Do I instantiate QName with the name of my class:
> > "disney.dis.session.PlayerSession"
> >
> >
> >
> > I tried doing this
> >
> > QName qName = new QName("disney.dis.session.PlayerSession");
> > BeanSerializerFactory bsf =
> > new BeanSerializerFactory(cl, qName);
> > BeanDeserializerFactory bdf =
> > new BeanDeserializerFactory(cl, qName);
> >
> > call.registerTypeMapping(cl, qName, bsf, bdf);
> >
> >
> > before my "invoke" call. I'm getting the same error.
> >
> > - Exception:
> > org.xml.sax.SAXException: Deserializing parameter 'getSessionReturn':
> > could not find deserializer for type {disney.dis}PlayerSession
> > at
> > org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)
> > at
> > org.apache.axis.encoding.DeserializationContext.startElement(
> > DeserializationContext.java:1035)
> >
> >
> >
> > I don't know if I'm on the right track or not. Any ideas anyone?
> >
> > Many thanks.
> >
> > Vartan
> >
> >
> >
> >
> > --- Rhimbo <[EMAIL PROTECTED]> wrote:
> >
> > > Hi Alick,
> > >
> > > Thanks for the reply. Below is the code I'm running.
> > >
> > > I am returning an instance of a class called PlayerSession from my
> > > web service. How do I specify the return type? Is this call
> > > correct?
> > > call.setReturnType(new QName("PlayerSession"));
> > >
> > > I'm getting the error when I run my DII client:
> > >
> > > org.xml.sax.SAXException: Deserializing parameter
> 'getSessionReturn':
> > > could not find deserializer for type {disney.dis}PlayerSession
> > > at
> > >
> org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)
> > > at
> > >
> > org.apache.axis.encoding.DeserializationContext.startElement(
> > DeserializationContext.java:1035)
> > >
> > >
> > >
> > > Here is the "whole" code:
> > >
> > > ServiceFactory serviceFactory = ServiceFactory.newInstance();
> > > Service service = new org.apache.axis.client.Service();
> > >
> > > Call call = (Call) service.createCall();
> > > call.setTargetEndpointAddress(new
> java.net.URL(sessionEndpoint));
> > >
> > > call.addParameter(new QName("uid"),
> > > new QName("int"),
> > > ParameterMode.IN);
> > > call.addParameter(new QName("productId"),
> > > new QName("string"),
> > > ParameterMode.IN);
> > > call.addParameter(new QName("sessionId"),
> > > new QName("int"),
> > > ParameterMode.IN);
> > > call.addParameter(new QName("context"),
> > > new QName("string"),
> > > ParameterMode.IN);
> > > call.setReturnType(new QName("PlayerSession"));
> > >
> > > Integer userID = new Integer(100);
> > > String productID = new String("PP_TTO");
> > > Integer sessionID = new Integer(98765);
> > > String context = new String("Some string with text! ");
> > > Object [] args =
> > > new Object [] {userID, productID, sessionID, context};
> > >
> > > QName opName = new QName("getSession");
> > > call.invoke(opName, args);
> > >
> > >
> > > Many thanks,
> > >
> > > Vartan
> > >
> > >
> > >
> > >
> > >
> > > --- Alick Buckley <[EMAIL PROTECTED]> wrote:
> > >
> > > >
> > > > Hi Rhimbo,
> > > >
> > > > I have been setting the return type on the OperationDesc using
> the
> > > > following
> > > > QNames.
> > > >
> > > > In this example the "com.acme.service.soap.Employee" bean is
> being
> > > > returned.
> > > >
> > > > new javax.xml.namespace.QName ( "http://soap.service.acme.com",
> > > > "Employee" )
> > > > ) ;
> > > >
> > > > For primitive types
> > > >
> > > > new javax.xml.namespace.QName (
> "http://www.w3.org/2001/XMLSchema",
> > > > "int" )
> > > > ) ;
> > > > new javax.xml.namespace.QName (
> "http://www.w3.org/2001/XMLSchema",
> > > > "long" )
> > > > ) ;
> > > > new javax.xml.namespace.QName (
> "http://www.w3.org/2001/XMLSchema",
> > > > "float"
> > > > ) ) ;
> > > > new javax.xml.namespace.QName (
> "http://www.w3.org/2001/XMLSchema",
>
=== message truncated ===
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com