⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 initializer.java

📁 动态调用WEBSERVICE,可以通过制定接口来调用
💻 JAVA
字号:
package com.dmwsinvoke.lang;

import java.lang.reflect.Array;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.description.OperationDesc;
import org.apache.axis.description.ParameterDesc;
import org.apache.axis.encoding.DeserializerFactory;
import org.apache.axis.encoding.SerializerFactory;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.*;

/**
 * 动态调用WEBservice的逻辑类
 * @author wangxi
 * */
public class Initializer
{
	private java.util.Vector cachedSerClasses = new java.util.Vector();
	private java.util.Vector cachedSerQNames = new java.util.Vector();
	private java.util.Vector cachedSerFactories = new java.util.Vector();
	private java.util.Vector cachedDeserFactories = new java.util.Vector();

	private OperationDesc oper = new OperationDesc();
	private Service service = new Service();
	private ParameterDesc param = new ParameterDesc();
	
	private String wsdl;

	public Call initialCall(String wsdl, String serviceMethod, Class exceptReturnType, Object[] params)
			throws ServiceException, MalformedURLException
	{
		this.wsdl = wsdl;
		String ns = this.wsdl;
		if(ns.endsWith("?wsdl"))
		{
			//构造命名空间
		   ns = ns.replaceAll("\\?wsdl", "");
		}	
		//调用服务名
		oper.setName(serviceMethod);
		this.setParam(params, ns);
		//返回类型声明
		oper.setReturnType(new QName(ns,exceptReturnType.toString().replaceAll(
				".*\\.", "")));
		if(exceptReturnType.isAssignableFrom(void.class))
		{
			oper.setReturnType(XMLType.AXIS_VOID);
		}else
		{
			//实际返回类型
			oper.setReturnClass(exceptReturnType);
			//方法返回简介
			oper.setReturnQName(new QName(ns,serviceMethod+ "Return"));
		}
		//匹配deploy上的style和use属性的值
		oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
		oper.setUse(org.apache.axis.constants.Use.LITERAL);

		this.setVector(params, exceptReturnType, ns);

		Call call = (Call) service.createCall();
		synchronized (this){
			call.setEncodingStyle(null);
			for (int i = 0; i < cachedSerFactories.size(); ++i)
			{
				//调用registerTypeMapping注册自定义复杂类型
				java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i);
				QName qName = (QName) cachedSerQNames.get(i);
				java.lang.Object x = cachedSerFactories.get(i);
				if (x instanceof Class)
				{
					Class sf = (Class) cachedSerFactories.get(i);
					Class df = (Class) cachedDeserFactories.get(i);
					call.registerTypeMapping(cls, qName, sf, df, false);
				} else if (x instanceof SerializerFactory)
				{
					SerializerFactory sf = (SerializerFactory) cachedSerFactories.get(i);
					DeserializerFactory df = (DeserializerFactory) cachedDeserFactories.get(i);
					call.registerTypeMapping(cls, qName, sf, df, false);
				}
			}
		}
		//服务地址
		call.setTargetEndpointAddress(new URL(wsdl));
		//设置好的服务对象
		call.setOperation(oper);
		//启用SOAP协议
		call.setUseSOAPAction(true);
		call.setSOAPActionURI("");
		call.setEncodingStyle(null);
		//不懂
		call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
		call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
		call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
		//设置调用的方法
		call.setOperationName(new javax.xml.namespace.QName(ns, serviceMethod));
			
		return call;
	}

	private void setVector(Object[] params, Class returnType, String ns)
	{
		Class beansf = BeanSerializerFactory.class;
		Class beandf = BeanDeserializerFactory.class;
		Class enumsf = EnumSerializerFactory.class;
		Class enumdf = EnumDeserializerFactory.class;
		Class arraysf = ArraySerializerFactory.class;
		Class arraydf = ArrayDeserializerFactory.class;
		Class simplesf = SimpleSerializerFactory.class;
		Class simpledf = SimpleDeserializerFactory.class;
		Class simplelistsf = SimpleListSerializerFactory.class;
		Class simplelistdf = SimpleListDeserializerFactory.class;
		for (int i = 0; i < params.length; i++)
		{
			if (!(params[i] instanceof Number)&&!(params[i] instanceof String))
			{
				//自定义复杂类型作为参数,需要起用序列化和反序列化工厂来转化
				if(params[i] instanceof Enumeration)
				{
					QName qName = new QName(ns,params[i].getClass().toString()
							.replaceAll(".*\\.", ""));
					cachedSerQNames.add(qName);
					cachedSerClasses.add(params[i].getClass());
					cachedSerFactories.add(enumsf);
					cachedDeserFactories.add(enumdf);
				}
				else if(params[i] instanceof Array)
				{
					QName qName = new QName(ns,params[i].getClass().toString()
							.replaceAll(".*\\.", ""));
					cachedSerQNames.add(qName);
					cachedSerClasses.add(params[i].getClass());
					cachedSerFactories.add(arraysf);
					cachedDeserFactories.add(arraydf);
				}
				else
				{
					QName qName = new QName(ns,params[i].getClass().toString()
							.replaceAll(".*\\.", ""));
					cachedSerQNames.add(qName);
					cachedSerClasses.add(params[i].getClass());
					cachedSerFactories.add(beansf);
					cachedDeserFactories.add(beandf);
				}
			}
		}

		if (!returnType.isAssignableFrom(Number.class)&&!returnType.isAssignableFrom(String.class))
		{
			//自定义复杂类型作为返回值.
			if(returnType .isAssignableFrom(Enumeration.class))
			{
				QName qName = new QName(ns,returnType.toString()
						.replaceAll(".*\\.", ""));
				cachedSerQNames.add(qName);
				cachedSerClasses.add(returnType);
				cachedSerFactories.add(enumsf);
				cachedDeserFactories.add(enumdf);
			}
			else if(returnType.isAssignableFrom(Array.class))
			{
				QName qName = new QName(ns,returnType.toString()
						.replaceAll(".*\\.", ""));
				cachedSerQNames.add(qName);
				cachedSerClasses.add(returnType);
				cachedSerFactories.add(arraysf);
				cachedDeserFactories.add(arraydf);
			}
			else if(!returnType.isAssignableFrom(void.class))
			{
				QName qName = new QName(ns,returnType.toString().replaceAll(".*\\.",
						""));
				cachedSerQNames.add(qName);
				cachedSerClasses.add(returnType);
				cachedSerFactories.add(beansf);
				cachedDeserFactories.add(beandf);
			}
		}
	}

	private void setParam(Object[] params, String ns)
	{		
		//参数匹配AXIS能认识的参数
		for (int i = 0; i < params.length; i++)
		{
			Class type = params[i].getClass();
			String arg = "arg"+i;
			
			if (type.isAssignableFrom(String.class))
			{
				param = new ParameterDesc(
						new QName(ns,arg),
						ParameterDesc.IN,
						new QName("http://www.w3.org/2001/XMLSchema", "string"),
						String.class, false, false);
			} else if (type.isAssignableFrom(Integer.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "int"),
						int.class, false, false);

			} else if (type.isAssignableFrom(Float.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "float"),
						float.class, false, false);
			} else if (type.isAssignableFrom(Double.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "double"),
						double.class, false, false);
			} else if (type.isAssignableFrom(Long.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "long"),
						long.class, false, false);
			}else if(type.isAssignableFrom(Boolean.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "boolean"),
						boolean.class, false, false);
			}else if(type.isAssignableFrom(java.util.Date.class))
			{
				param = new org.apache.axis.description.ParameterDesc(
						new QName(ns,arg), ParameterDesc.IN, new QName(
								"http://www.w3.org/2001/XMLSchema", "dateTime"),
						java.util.Calendar.class, false, false);
			}
			else
			{
				param = new ParameterDesc(new QName(ns,arg), ParameterDesc.IN,
						new QName(ns,params[i].getClass().toString().replaceAll(".*\\.", "")), params[i].getClass(), false, false);
			}
			oper.addParameter(param);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -