请问axis如何用wsdd部署(返回自定义类型)

时间:2020-12-03 19:32:46
一个web service 返回自定义类型  好象用jws 反序列化不行
用wsdd也部署不上,请高人指教!代码

服务端代码

/******************************************************************************
 * File name:      *.java
 * Create date:    2004-9-16
 * Copyright:      Copyright (c) 2003 been protected by eazom
 * @Author:        softteam
 * @Version:       1.0
 * To change the template for this generated file go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 * 
 * Modify History
 * Author           Date            Description
 */

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
public class WebObject1 {

/**
 * 
 */
public WebObject1() {
super();
// TODO Auto-generated constructor stub
}

public ReqMsg GetNameObject(ReqMsg r)
{
String newname="Bob"+r.get_Name();
int  newage =100+r.get_Age();
r.set_Name(newname);
r.set_Age(newage);
return r;
}

public static void main(String[] args) {
}
}
class ReqMsg
{
public ReqMsg(){}
String m_strName="";
int    m_nAge;

public String get_Name(){return m_strName;}
public void   set_Name(String strIn){m_strName=strIn;}

public int    get_Age(){return m_nAge;}
public void   set_Age(int nIn){m_nAge=nIn;}
}

//server-config.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="WebObject1" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="WebObject1"/>
   <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 
             encodingStyle="http://localhost" 
             qname="ns3: ReqMsg" 
             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" 
             type="java:DefaultNamespace.ReqMsg" 
             xmlns:ns2="http://localhost"/>
 </service>
 </deployment>

http://localhost/myapp/WebObject1.jws?wsdl
可以看到发布成功


客户端代码

import localhost.myapp.WebObject1_jws.*;
。。。。。。


try
{
WebObject1Service ws1 = new WebObject1ServiceLocator();
localhost.myapp.WebObject1_jws.WebObject1 w1  = ws1.getWebObject1();
DefaultNamespace.ReqMsg r1 =new DefaultNamespace.ReqMsg();
r1.set_Age(10);
r1.set_Name("coco");
DefaultNamespace.ReqMsg r2 = w1.getNameObject(r1);
System.out.println(r2.get_Name());
System.out.println(Integer.toString(r2.get_Age()));

}catch(Exception e)
{
e.printStackTrace();
}


结果

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXException: Deserializing parameter &apos;r&apos;:  could not find deserializer for type {http://DefaultNamespace}ReqMsg
 faultActor: 
 faultNode: 
 faultDetail: 
{http://xml.apache.org/axis/}stackTrace: AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXException: Deserializing parameter &amp;apos;r&amp;apos;:  could not find deserializer for type {http://DefaultNamespace}ReqMsg
 faultActor: 
 faultNode: 
 faultDetail: 

org.xml.sax.SAXException: Deserializing parameter 'r':  could not find deserializer for type {http://DefaultNamespace}ReqMsg

请高手帮忙,谢谢!

7 个解决方案

#1


up

#2


class ReqMsg  implements Serializable{// you must add it.
public ReqMsg(){}
String m_strName="";
int    m_nAge;

public String get_Name(){return m_strName;}
public void   set_Name(String strIn){m_strName=strIn;}

public int    get_Age(){return m_nAge;}
public void   set_Age(int nIn){m_nAge=nIn;}
}

// I'd rather invoke the address from :
http://localhost/myapp/WebObject1

#3


远程方法调用的参数以及返回值对象都必须是可序列化的

http://www.javayou.com

#4


不懂,帮顶混分
好难啊

#5


错误在于qname="ns3: ReqMsg" 中,没有指出ns3的名字空间,使得axis序列化不知道如何匹配序列化类与名字空间的关系

#6


楼上所说正解...我原来也原到这个问题........就是不解解析自己定义类型.最后用jb来弄其所生成的wsdl就能让客户端能正确解析自定义类型...

#7


自定义的类型,还是借助IDE来开发比较好呢,
因为IDE要根据自定义类型,自动生成一些java的类。
自己写的话,如果不是对webservice开发很熟练,
是不知道要写些什么呢,还有命名的规则等等。

#1


up

#2


class ReqMsg  implements Serializable{// you must add it.
public ReqMsg(){}
String m_strName="";
int    m_nAge;

public String get_Name(){return m_strName;}
public void   set_Name(String strIn){m_strName=strIn;}

public int    get_Age(){return m_nAge;}
public void   set_Age(int nIn){m_nAge=nIn;}
}

// I'd rather invoke the address from :
http://localhost/myapp/WebObject1

#3


远程方法调用的参数以及返回值对象都必须是可序列化的

http://www.javayou.com

#4


不懂,帮顶混分
好难啊

#5


错误在于qname="ns3: ReqMsg" 中,没有指出ns3的名字空间,使得axis序列化不知道如何匹配序列化类与名字空间的关系

#6


楼上所说正解...我原来也原到这个问题........就是不解解析自己定义类型.最后用jb来弄其所生成的wsdl就能让客户端能正确解析自定义类型...

#7


自定义的类型,还是借助IDE来开发比较好呢,
因为IDE要根据自定义类型,自动生成一些java的类。
自己写的话,如果不是对webservice开发很熟练,
是不知道要写些什么呢,还有命名的规则等等。