📄 initializer.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 + -