`
leo918
  • 浏览: 10438 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Axis webservice 传递自定义类型和接收自定义类型返回值

阅读更多

1、建立web 工程,)引入axis相关jar包,编写webservice服务器端(这里为DataTransService.java)

DataTransService.java

package com.trs.service;

import net.sf.json.JSONObject;
import com.trs.entity.CPDetailResult;
import com.trs.entity.CPListResult;
import com.trs.entity.CPQuery;
import com.trs.entity.ExplainData;

public class DataTransService{

	public String Explain() {
		System.out.println("method Explain() excuted");
		ExplainData explainData = new ExplainData();
		/**测试部分开始...*/
		explainData.setName("TRSSERVER数据库");
		/**测试部分结束...*/
		System.out.println("######## "+explainData.getName());
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(explainData);
		return jSonString;
	}
	
	public CPListResult GetList(CPQuery q) {
		System.out.println("method GetList() excuted");
		CPListResult listResult = new CPListResult();
		System.out.println("CPQuery DBName: "+q.getDBName());
		listResult.setMessage(q.getDBName());
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(listResult);
		return listResult;
	}

	public String GetDetail(long detailid){
		System.out.println("method GetDetail() excuted");
		CPDetailResult detailResult = new CPDetailResult();
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(detailResult);
		return jSonString;
	}
	
	private String objectToJsonString(Object o) {
		//对象转json
		JSONObject jObject = JSONObject.fromObject(o);		
		return jObject.toString();
	}

}
 

2、在工程目录zb_service\WebRoot\WEB-INF目录下新建一个deploy.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="DataTransService" provider="java:RPC">
        <parameter name="className" value="com.trs.service.DataTransService"/>
        <parameter name="allowedMethods" value="*"/>
    </service>
</deployment>
 

3、在E:\workspace\zb_service\WebRoot\WEB-INF目录下运行:

java -Djava.ext.dirs=E:\workspace\zb_service\WebRoot\WEB-INF\lib  org.apache.axis.client.AdminClient -lhttp://localhost:8080/zb_service/services/AdminService deploy.wsdd

则在zb_service\WebRoot\WEB-INF目录下会生成一个文件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">
 <globalConfiguration>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="disablePrettyXML" value="true"/>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" value="D:\Tomcat6.0\webapps\zb_service\WEB-INF\attachments"/>
  <parameter name="dotNetSoapEncFix" value="true"/>
  <parameter name="enableNamespacePrefixOptimization" value="false"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
  <parameter name="sendXsiTypes" value="true"/>
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
 </globalConfiguration>
 <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
 <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 <service name="AdminService" provider="java:MSG">
  <parameter name="allowedMethods" value="AdminService"/>
  <parameter name="enableRemoteAdmin" value="false"/>
  <parameter name="className" value="org.apache.axis.utils.Admin"/>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
 </service>
 <service name="DataTransService" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="com.trs.service.DataTransService"/>
    <!-- 这里定义了方法的参数以及返回值 -->
	 <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"   
	 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPQuery"
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
	 type="java:com.trs.entity.CPQuery" xmlns:ns="urn:MyService"/>
	 
	 <typeMapping
	 deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"    
	 	encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPListResult"    
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"    
	 type="java:com.trs.entity.CPListResult" xmlns:ns="urn:MyService"/>
	 
	 <typeMapping
	 deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"    
	 	encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPRecord"    
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"    
	 type="java:com.trs.entity.CPRecord" xmlns:ns="urn:MyService"/>	

 
 </service>
 <service name="Version" provider="java:RPC">
  <parameter name="allowedMethods" value="getVersion"/>
  <parameter name="className" value="org.apache.axis.Version"/>
 </service>
 <transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
  <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
  <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
 </transport>
 <transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
 </transport>
</deployment>
 

黑体部分为后来加入的设置

 

客户端代码:

package com.trs.client;

import javax.xml.namespace.QName;

import net.sf.json.JSONObject;

import org.apache.axis.Constants;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

import com.trs.entity.*;

public class DataTransClient {
	
	//创建访问点
	private static String ENDPOINT = "http://localhost:8080/zb_service/services/DataTransService";
	
	//获取数据库相关说明服务名
	private static String DATAEXPLAIN = "Explain";
	
	//获取数据列表服务名
	private static String GETLIST = "GetList";
	
	//获取数据细缆服务名
	private static String GETDETAIL = "GetDetail";
	
	public void ExplainData(){
	  try{
	   //创建service
	   Service service = new Service();
	   Call call = null;
	   //创建call
	   call = (Call) service.createCall();
	   //设置操作名
	   call.setOperationName(new QName(ENDPOINT,DATAEXPLAIN));
	   //设置访问点
	   call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
	   //调用服务,返回值
	   String ret = (String) call.invoke(new Object[]{});
	   JSONObject jsObject = JSONObject.fromObject(ret);
	   System.out.println(("name:" + jsObject.getString("name")));
	  }catch (Exception ex){
	   ex.printStackTrace();
	  }
	}
	
	public void getList(CPQuery query){
		try{
		   //创建service
		   Service service = new Service();
		   Call call = null;
		   //创建call
		   call = (Call) service.createCall();
		   QName qName1 = new QName("urn:MyService","CPQuery");
		   QName qName2 = new QName("urn:MyService","CPListResult");
		   QName qName3 = new QName("urn:MyService","CPRecord");
		   //设置操作名
		   call.setOperationName(new QName(ENDPOINT,GETLIST));
		   //设置访问点
		   call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
		   // 注册序列化和反序列化类
		   call.registerTypeMapping(CPQuery.class, qName1,
				new BeanSerializerFactory(CPQuery.class, qName1),
				new BeanDeserializerFactory(CPQuery.class, qName1));
		   
		   call.registerTypeMapping(CPListResult.class, qName2,
					new BeanSerializerFactory(CPListResult.class, qName2),
					new BeanDeserializerFactory(CPListResult.class, qName2));
		   
		   call.registerTypeMapping(CPRecord.class, qName3,
					new BeanSerializerFactory(CPRecord.class, qName3),
					new BeanDeserializerFactory(CPRecord.class, qName3));

		   //调用服务,返回值
		   CPListResult ret = (CPListResult) call.invoke(new Object[]{query});
		   System.out.println("返回的信息是:" + ret.getMessage()+ret.getRecords()[0].getDetailID());
		  }catch (Exception ex){
		   ex.printStackTrace();
		  }
	}

	public void getDetail(long id){
		try{
		    //创建service
		    Service service = new Service();
		    Call call = null;
		    QName QNAME = new QName(ENDPOINT,GETDETAIL);
		    //创建call
		    call = (Call) service.createCall();
		    //设置操作名
		    call.setOperationName(QNAME);
		    //设置访问点
		    call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
		    //调用服务,返回值
		    CPDetailResult ret = (CPDetailResult) call.invoke(new Object[]{id});
		    System.out.println("返回的信息是:" + ret);
		   }catch (Exception ex){
		    ex.printStackTrace();
		   }
	}
	
	public static void main(String args[]){
		DataTransClient client = new DataTransClient();
//		client.ExplainData();
		CPQuery query = new CPQuery();
		query.setDBName("oracle");
		client.getList(query);
//		long id = 100;
//		client.getDetail(id);
	}
}

  小结:当自定义类型参数或返回值里含有多个自定义类型对象时,对这些包含的自定义类型对象也如做如上的配置,这样看来,使用比较繁琐。Jeson类给我们提供了一个新的方式,在上面的服务器端代码里,jeson对自定义类型的参数和返回值做了字符串的转换,因此,传递自定义类型变成了传递字符串,我们只需在客户端和服务器端代码里对字符串进行jeson转换就可以了。如:

JSONObject jsObject = JSONObject.fromObject(ret);
	   System.out.println(("name:" + jsObject.getString("name")));
 

 

分享到:
评论

相关推荐

    axis2_demo实战 复杂对象传输 文件传输

    "传Object"是指在Web服务接口中可以传递自定义的Java对象。Axis2支持对象序列化和反序列化,使得对象可以被转换为XML格式在网络间传输,然后在接收端反序列化回对象。这对于跨系统的业务对象交换非常有用。 接着,...

    axis1-WebService

    Axis支持传递复杂对象和内部类作为参数或返回值。在服务端,需要确保这些类具有正确的序列化和反序列化实现,以便在客户端和服务器之间正确地传输数据。 **五、Handler和Chain特性** Handler是Axis中的一个关键...

    WebService大讲堂之Axis2(2):复合类型数据的传递.pdf

    总结,本篇内容主要讲解了如何在 Axis2 中处理复合类型数据的传递,包括数组(一维和二维)以及自定义类对象。通过 Axis2,开发者可以直接使用 Java 类型作为 WebService 方法的参数和返回值,简化了开发过程。同时...

    webservice2 符合数据类型

    1. **复合类型数据**:在实际应用中,除了基本数据类型(如int, String等)外,我们还需要传递更复杂的结构,如数组和自定义对象。在Axis2中,可以直接使用Java的数组或自定义类(接口)作为WebService方法的参数或...

    WebService大讲堂之Axis2.pdf

    综上所述,Axis2 提供了一种灵活且强大的方式来构建和管理 WebService。无论是简单的 POJO 类发布还是复杂的跨服务会话管理,Axis2 都能够提供全面的支持。这对于企业级应用来说非常重要,因为它不仅降低了开发...

    java处理.net webservice返回的对象

    接下来,我们看一个简单的示例,展示如何调用.NET WebService的`GetSafeMode`方法并传递参数及接收返回值: ```java @WebMethod public string GetSafeMode(string factoryId, string simId) { ……. return “0...

    Webservice接口开发

    // 当返回值为其他类型如自定义类型、Map、List 等时,将其序列化后返回 public byte[] test4(String arg) { Map, Object&gt; map = new HashMap(); map.put("测试", arg); try (ByteArrayOutputStream baos = ...

    Web Service 的一个简单例子

    参数是用来传递信息的变量,它们可以是基本类型(如字符串、整数、浮点数等)或者复杂类型(如自定义的对象)。返回值则是服务执行操作后返回的结果,同样可以是基本类型或复杂类型。 在这个简单的例子中,我们可能...

    java私塾全部笔记

    - 方法定义、参数传递和返回值。 - 方法重载和递归。 ##### 第三章 Java类和对象 - **类的概念** - 类是对象的蓝图,定义了一组相似对象的共同特征。 - **对象实例化** - 如何创建类的实例对象。 - 对象的引用...

Global site tag (gtag.js) - Google Analytics