Thanks Venkatesh,
Here are the code:
-------------------------------first bean-----------------------------
public class Request
{
private Param _params=null;
public Param getParams()
{ return _params; }
public void setParams(Param params)
{ _params=params; }
}
------------------------------------2nd bean----------------------
{
private Param _params=null;
public Param getParams()
{ return _params; }
public void setParams(Param params)
{ _params=params; }
}
------------------------------------2nd bean----------------------
public class Param implements java.io.Serializable
{
private String name=null;
private Object value=null;
// Bean accessors
public String getName()
{ return name; }
public void setName(String data)
{ name = data; }
public Object getValue()
{ return value; }
public void setValue(Object data)
{ value=data; }
}
--------------------------------------------- service -----------------------------------
{
private String name=null;
private Object value=null;
// Bean accessors
public String getName()
{ return name; }
public void setName(String data)
{ name = data; }
public Object getValue()
{ return value; }
public void setValue(Object data)
{ value=data; }
}
--------------------------------------------- service -----------------------------------
public class PublicService2
{
public Param getSingleBusinessLocation(Request req){
{
public Param getSingleBusinessLocation(Request req){
Param line1= new Param();
line1.setName("LINE_1");
line1.setValue("121 River Street");
return line1;
}
}
------------------------------------------ client --------------------------------------
public class Client
{
public static void main(String [] args) throws Exception
{
Options options = new Options(args);
Request req = new Request();
Service service = new Service();
Call call = (Call) service.createCall();
QName qn = new QName( "urn:PublicService2", "Request" );
{
public static void main(String [] args) throws Exception
{
Options options = new Options(args);
Request req = new Request();
Service service = new Service();
Call call = (Call) service.createCall();
QName qn = new QName( "urn:PublicService2", "Request" );
call.registerTypeMapping(Request.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(Request.class, qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(Request.class, qn));
new org.apache.axis.encoding.ser.BeanSerializerFactory(Request.class, qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(Request.class, qn));
Param result=null;
try {
call.setTargetEndpointAddress( new java.net.URL(options.getURL()) );
call.setOperationName( new QName("PublicService2", "getSingleBusinessLocation") );
call.addParameter( "arg1", qn, ParameterMode.IN );
call.setReturnClass(Param.class);
try {
call.setTargetEndpointAddress( new java.net.URL(options.getURL()) );
call.setOperationName( new QName("PublicService2", "getSingleBusinessLocation") );
call.addParameter( "arg1", qn, ParameterMode.IN );
call.setReturnClass(Param.class);
result = (Param) call.invoke( new Object[] { req } );
} catch (AxisFault fault) {
String error = "Error : " + fault.toString();
System.out.println(error);
}
System.out.println("Name Value");
System.out.println("------------------------");
String name = result.getName();
String value = (String)result.getValue();
System.out.println(name+" "+value);
}
}
------------------------------------ deploy.wsdd----------------------------------
} catch (AxisFault fault) {
String error = "Error : " + fault.toString();
System.out.println(error);
}
System.out.println("Name Value");
System.out.println("------------------------");
String name = result.getName();
String value = (String)result.getValue();
System.out.println(name+" "+value);
}
}
------------------------------------ deploy.wsdd----------------------------------
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="PublicService2" provider="java:RPC" style="wrapped">
<parameter name="className" value="apacheaxis.PublicService2"/>
<parameter name="allowedMethods" value="getSingleBusinessLocation"/>
<beanMapping qname="myNS:Request" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Request"/>
<beanMapping qname="myNS:Param" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Param"/>
<typeMapping qname="myNS:Param" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Param"
deserializer="apacheaxis.ParamDeserFactory"/>
</service>
</deployment>
<service name="PublicService2" provider="java:RPC" style="wrapped">
<parameter name="className" value="apacheaxis.PublicService2"/>
<parameter name="allowedMethods" value="getSingleBusinessLocation"/>
<beanMapping qname="myNS:Request" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Request"/>
<beanMapping qname="myNS:Param" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Param"/>
<typeMapping qname="myNS:Param" xmlns:myNS="urn:PublicService2" languageSpecificType="java:apacheaxis.Param"
deserializer="apacheaxis.ParamDeserFactory"/>
</service>
</deployment>
Using the above code I was getting No Deserializer found for class Param. So I wrote one as follow:
----------------------------------------------Deserializer-----------------------------------
public class ParamDeser extends DeserializerImpl
{
public static final String NAME = "name";
public static final String VALUE = "vlaue";
public static final QName myTypeQName = new QName("typeNS", "Param");
private Hashtable typesByMemberName = new Hashtable();
public ParamDeser()
{
typesByMemberName.put(NAME, Constants.XSD_STRING);
typesByMemberName.put(VALUE, Constants.XSD_ANYTYPE);
value = new Param();
}
/** DESERIALIZER STUFF - event handlers
*/
{
public static final String NAME = "name";
public static final String VALUE = "vlaue";
public static final QName myTypeQName = new QName("typeNS", "Param");
private Hashtable typesByMemberName = new Hashtable();
public ParamDeser()
{
typesByMemberName.put(NAME, Constants.XSD_STRING);
typesByMemberName.put(VALUE, Constants.XSD_ANYTYPE);
value = new Param();
}
/** DESERIALIZER STUFF - event handlers
*/
/**
* This method is invoked when an element start tag is encountered.
* @param namespace is the namespace of the element
* @param localName is the name of the element
* @param prefix is the element's prefix
* @param attributes are the attributes on the element...used to get the type
* @param context is the DeserializationContext
*/
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
{
QName typeQName = (QName)typesByMemberName.get(localName);
if (typeQName == null)
throw new SAXException("Invalid element in Data struct - " + localName);
// These can come in either order.
Deserializer dSer = context.getDeserializerForType(typeQName);
try {
dSer.registerValueTarget(new FieldTarget(value, localName));
} catch (NoSuchFieldException e) {
throw new SAXException(e);
}
if (dSer == null)
throw new SAXException("No deserializer for a " + typeQName + "???");
return (SOAPHandler)dSer;
}
}
------------------------------------Deser factory---------------------------
* This method is invoked when an element start tag is encountered.
* @param namespace is the namespace of the element
* @param localName is the name of the element
* @param prefix is the element's prefix
* @param attributes are the attributes on the element...used to get the type
* @param context is the DeserializationContext
*/
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
{
QName typeQName = (QName)typesByMemberName.get(localName);
if (typeQName == null)
throw new SAXException("Invalid element in Data struct - " + localName);
// These can come in either order.
Deserializer dSer = context.getDeserializerForType(typeQName);
try {
dSer.registerValueTarget(new FieldTarget(value, localName));
} catch (NoSuchFieldException e) {
throw new SAXException(e);
}
if (dSer == null)
throw new SAXException("No deserializer for a " + typeQName + "???");
return (SOAPHandler)dSer;
}
}
------------------------------------Deser factory---------------------------
public class ParamDeserFactory implements DeserializerFactory {
private Vector mechanisms;
private Vector mechanisms;
public ParamDeserFactory() {
}
public javax.xml.rpc.encoding.Deserializer getDeserializerAs(String mechanismType) {
return new ParamDeser();
}
public Iterator getSupportedMechanismTypes() {
if (mechanisms == null) {
mechanisms = new Vector();
mechanisms.add(Constants.AXIS_SAX);
}
return mechanisms.iterator();
}
}
}
public javax.xml.rpc.encoding.Deserializer getDeserializerAs(String mechanismType) {
return new ParamDeser();
}
public Iterator getSupportedMechanismTypes() {
if (mechanisms == null) {
mechanisms = new Vector();
mechanisms.add(Constants.AXIS_SAX);
}
return mechanisms.iterator();
}
}
and here is the complete error message with the stack trace:
Feb 4, 2004 10:34:07 AM org.apache.axis.client.Call invoke
SEVERE: No returnType was specified to the Call object! You must call setReturn
Type() if you have called addParameter().
Feb 4, 2004 10:34:08 AM org.apache.axis.client.Call invoke
SEVERE: Exception:
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which
is NOT expected, in something it was trying to deserialize.
at org.apache.axis.encoding.ser.SimpleDeserializer.onStartChild(SimpleDe
serializer.java:189)
at org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
rializationContextImpl.java:963)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
va:198)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
t.java:722)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:233)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:347)
at org.apache.axis.client.Call.invoke(Call.java:2272)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at apacheaxis.Client.main(Client.java:35)
Error : org.xml.sax.SAXException: SimpleDeserializer encountered a child element
, which is NOT expected, in something it was trying to deserialize.
Name Value
------------------------
Exception in thread "main" java.lang.NullPointerException
at apacheaxis.Client.main(Client.java:42)
SEVERE: No returnType was specified to the Call object! You must call setReturn
Type() if you have called addParameter().
Feb 4, 2004 10:34:08 AM org.apache.axis.client.Call invoke
SEVERE: Exception:
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which
is NOT expected, in something it was trying to deserialize.
at org.apache.axis.encoding.ser.SimpleDeserializer.onStartChild(SimpleDe
serializer.java:189)
at org.apache.axis.encoding.DeserializationContextImpl.startElement(Dese
rializationContextImpl.java:963)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.ja
va:198)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElemen
t.java:722)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:233)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:347)
at org.apache.axis.client.Call.invoke(Call.java:2272)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at apacheaxis.Client.main(Client.java:35)
Error : org.xml.sax.SAXException: SimpleDeserializer encountered a child element
, which is NOT expected, in something it was trying to deserialize.
Name Value
------------------------
Exception in thread "main" java.lang.NullPointerException
at apacheaxis.Client.main(Client.java:42)
Thanks so much.
Tony.
Venkatesh Kancharla <[EMAIL PROTECTED]> wrote:
Venkatesh Kancharla <[EMAIL PROTECTED]> wrote:
can you please post both the objects? I did face this problem long back
and I don`t clearly remember how I solved it. Maybe after seeing the
object, I may be able to give you some solution
regards
-------------------
Venkatesh Kancharla
_|_|_|_|_| _|_|_|_|_| _|_|_|_|_| _|_|_|_|_| _|_| _| _|_|_|_|_|
_| _| _| _| _| _| _| _| _| _| _|
_|_|_|_|_| _| _|_|_|_|_| _|_|_|_|_| _| _| _| _| _|
_| _| _| _| _| _| _| _| _| _| _|
_|_|_|_|_| _| _| _| _| _| _| _|_| _|_|_|_|_|
A L G O R I T H M S F O R L I F E
Strand Genomics,
# 237, Sir C.V. Raman Avenue,
Rajmahal Vilas,
Bangalore, India - 560080.
Ph no: 23618992,93, 94, 95 ext: 212
http://www.strandgenomics.com
Favorite quote:
---------------------------------------------------------------------
If Necessity Is the Mother of Invention,
then frustration Is Its Father
-unknown
---------------------------------------------------------------------
On Wed, 4 Feb 2004, Tony Blair wrote:
> Hi Venkatesh,
>
> Thanks for the reply. Answer to your question is 'yes'. My bean contains another bean inside. Both beans have getters and setters. None of the samples that came with axis download have similiar situation. They all contain simple types.
>
> Initially I was getting "no deserializer found error" so I mimic the deserializer code from the samples in the "encoding" sub-package and added type mapping to my deploy.wsdd and no I am getting this SimpleDeserializer error!
>
> Do you still have any idea as why I am getting this error? Should I post my code?
>
> Thanks,
> Tony.
>
> Venkatesh Kancharla <[EMAIL PROTECTED]>wrote:
> >
> > Error : org.xml.sax.SAXException: SimpleDeserializer encountered a child element
> > , which is NOT expected, in something it was trying to deserialize.
> >
> > My client is invoking a call to the service and pass it a bean that has a complex type as a data member. Should I post the code and deploy.wsdd?
>
> is your complex object a bean? you can only pass beans ( it should have
> setter/getter methods for all of its instance variables)
>
>
> >
> > Thanks in advance.
> >
> >
> > ---------------------------------
> > Do you Yahoo!?
> > Yahoo! SiteBuilder - Free web site building tool. Try it!
>
>
> ---------------------------------
> Do you Yahoo!?
> Yahoo! SiteBuilder - Free web site building tool. Try it!
Do you Yahoo!?
Yahoo! SiteBuilder - Free web site building tool. Try it!
