升级到 JDK 5.0 Update 1 定制部署 WebServices - Axis 终于正常了!
JDK 1.4.x 是正常的! 但是 JDK 5.0 定制部署 WebServices - Axis 时,执行命令行: java org.apache.axis.client.AdminClient deploy.wsdd 总不正常! 升级到 Update 1: java version "1.5.0_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08) Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode, sharing) 终于又可以了! 相关下载:
JDK 5.0 Update 1: http://dlc.sun.com/jdk/jdk-1_5_0_01-windows-i586-p.exe
Resin 2.1.16 (推荐,因为相对于 Tomcat 小巧) http://www.caucho.com/download/resin-2.1.16.zip
Tomcat 5.5.7 http://apache.justdn.org/jakarta/tomcat-5/v5.5.7/bin/jakarta-tomcat-5.5.7.zip
Apache WebServices - Axis v1.1: (June 16, 2003) http://apache.freelamp.com/ws/axis/1_1/axis-1_1.zip 解压后,将 axis-1_1\webapps\ 目录下的 axis 目录复制到 Resin 或 Tomcat 的 webapps 目录下!
JavaMail API 1.3.2 FCS: http://192.18.97.52/ECom/EComTicketServlet/BEGIN0C28A9F726724B9DD60F1DA518A6C32A/-2147483648/755528103/1/540782/540770/755528103/2ts+/westCoastFSEND/javamail-1_3_2-oth-JPR/javamail-1_3_2-oth-JPR:1/javamail-1_3_2.zip
JavaBeans(TM) Activation Framework 1.0.2: http://192.18.97.131/ECom/EComTicketServlet/BEGIN145B389A284A19AC4F88E80C4CFBA0D3/-2147483648/755539779/1/359918/359906/755539779/2ts+/westCoastFSEND/7017-jaf-1.0.2-oth-JPR/7017-jaf-1.0.2-oth-JPR:1/jaf-1_0_2-upd.zip
XML Security Version 1.2 of the Java library: http://xml.apache.org/security/dist/java-library/xml-security-bin-1_2_0.zip
清单: activation.jar axis-ant.jar axis.jar commons-discovery.jar commons-logging-api.jar commons-logging.jar jaxrpc.jar log4j-1.2.8.jar mail.jar saaj.jar stylebook-1.0-b3_xalan-2.jar wsdl4j.jar xalan.jar xercesImpl.jar xml-apis.jar xmlParserAPIs.jar xmlsec.jar xmlsecSamples.jar xmlsecTests.jar
Class1.java 文件保存到 \webapps\axis\WEB-INF\classes\Class1.java 执行: javac Class1.java 编译成 Class1.class: public class Class1 { public static void main() { System.out.println("Hello World!"); //System.out.println(new jwsClass1().SayHelloTo("世界!")); } public String SayHelloTo(String Who) { return "你好: " + Who; } public String SayHelloToo(String Who) { return "你好: " + Who; } }
http://localhost:1080/axis/services/Class1Service?wsdl 另存为: xx.wsdl deploy.wsdd (undeploy.wsdd) 文件,可由命令行:
java org.apache.axis.wsdl.WSDL2Java --skeletonDeploy true xx.wsdl 生成: deploy.wsdd (undeploy.wsdd) 部署文件 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="Class1Service" provider="java:RPC"> <parameter name="className" value="Class1"/> <parameter name="allowedMethods" value="*"/> </service> </deployment>
客户端:
(a)从 WSDL 文件生成客户端存根 (stub) 代码,服务端框架 (skeleton) 代码以及 WSDL 中的数据类型文件(生成与之对应的 Java 代码)
1. deploy.wsdd : MyService 服务的部署描述文件 2. MyService.java : MyService 服务的接口文件 3. MyServiceService.java : 获得 MyService 服务的接口文件 4. MyServiceServiceLocator.java : 实现 MyServiceService 接口 5. MyServiceSoapBindingImpl.java : 实现 MyService 接口,应向其中补充业务逻辑 6. MyServiceSoapBindingSkeleton.java : MyService 服务的服务端框架代码,实现 MyService, org.apache.axis.wsdl.Skeleton 接口 7. MyServiceSoapBindingStub.java :MyService 服务的客户端存根代码,实现 MyService 接口 8. undeploy.wsdd : 注销 MyService 服务的部署描述文件
(b) 动态调用 WebServices : 参阅: 王咏刚 wsCaller:Web Service通用客户端和测试工具 http://www.contextfree.net/wangyg/c/wsCaller/wsCaller.html
import org.apache.axis.Constants; import org.apache.axis.encoding.ser.SimpleDeserializer; import org.apache.axis.wsdl.gen.Parser; import org.apache.axis.wsdl.symbolTable.*;
import javax.wsdl.*; //import javax.wsdl.extensions.soap.SOAPAddress; import javax.xml.namespace.QName; import javax.xml.rpc.Call; import javax.xml.rpc.encoding.Deserializer; import javax.xml.rpc.encoding.DeserializerFactory;
import java.util.*;
//import localhost.axis.services; // Web Service Dynamic Invoker
public class DynamicInvoker { private Parser wsdlParser = null; private Map services = null;
public DynamicInvoker(String wsdlURL) throws Exception { wsdlParser = new Parser(); wsdlParser.run(wsdlURL); services = enumSymTabEntry(ServiceEntry.class); }
public Map invoke(String serviceName, String portName, String operationName, Vector parameterValues) throws Exception { Vector inputs = new Vector(); String returnName = null;
ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Service service = serviceEntry.getService(); org.apache.axis.client.Service clientService = new org.apache.axis.client.Service(wsdlParser, service.getQName());
Call call = clientService.createCall(QName.valueOf(portName), QName.valueOf(operationName)); ((org.apache.axis.client.Call) call).setTimeout(new Integer(15 * 1000));
BindingEntry bindingEntry = getBindingEntry(serviceName, portName); Operation o = getOperation(bindingEntry, operationName); Parameters parameters = bindingEntry.getParameters(o);
if (parameters.returnParam != null) { //QName returnType = org.apache.axis.wsdl.toJava.Utils.getXSIType(parameters.returnParam); QName returnQName = parameters.returnParam.getQName(); returnName = returnQName.getLocalPart(); }
int size = parameters.list.size(); for (int i = 0; i < size; i++) { Parameter p = (Parameter) parameters.list.get(i); switch (p.getMode()) { case Parameter.IN : inputs.add(getParamData((org.apache.axis.client.Call) call , p , (String) parameterValues.elementAt(i))); break; case Parameter.OUT : break; case Parameter.INOUT : inputs.add(getParamData((org.apache.axis.client.Call) call, p, (String) parameterValues.elementAt(i))); break; } }
Object ret = call.invoke(inputs.toArray()); Map outputs = call.getOutputParams(); HashMap map = new HashMap(); if (ret != null && returnName != null) { map.put(returnName, ret); } if (outputs != null) { for (Iterator i = outputs.keySet().iterator(); i.hasNext();) { Object obj = i.next(); String name; Object value; if (obj.getClass().getName().equals("java.lang.String")) { name = (String) obj; } else { name = ((QName) obj).getLocalPart(); } value = outputs.get(obj); map.put(name, value); } } return map; }
public Vector enumServiceNames() { Vector v = new Vector(); Iterator i = services.keySet().iterator(); while (i.hasNext()) { String s = (String) i.next(); v.addElement(s); } return v; }
public Vector enumPortNames(String serviceName) { Vector v = new Vector(); ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Map ports = serviceEntry.getService().getPorts(); Iterator i = ports.keySet().iterator(); while (i.hasNext()) { String s = (String) i.next(); v.addElement(s); } return v; }
public Vector enumOperationNames(String serviceName, String portName) { Vector v = new Vector(); BindingEntry entry = getBindingEntry(serviceName, portName); Set operations = entry.getOperations(); Iterator i = operations.iterator(); while (i.hasNext()) { Operation o = (Operation) i.next(); String s = o.getName(); v.addElement(s); } return v; }
public Parameters enumParameters(String serviceName , String portName , String operationName) { BindingEntry entry = getBindingEntry(serviceName, portName); Operation o = getOperation(entry, operationName); Parameters parameters = entry.getParameters(o); return parameters; }
public String getParameterModeString(Parameter p) { String ret = null; switch (p.getMode()) { case Parameter.IN: ret = "[IN]"; break; case Parameter.INOUT: ret = "[IN, OUT]"; break; case Parameter.OUT: ret = "[OUT]"; break; } return ret; }
private BindingEntry getBindingEntry(String serviceName, String portName) { ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Port port = serviceEntry.getService().getPort(portName); Binding binding = port.getBinding(); SymbolTable table = wsdlParser.getSymbolTable(); return table.getBindingEntry(binding.getQName()); }
private Operation getOperation(BindingEntry entry, String operationName) { Set operations = entry.getOperations(); Iterator i = operations.iterator(); while (i.hasNext()) { Operation o = (Operation) i.next(); if (operationName.equals(o.getName())) { return o; } } return null; }
// return Map of <QName.getLocalPart, SymTabEntry> private Map enumSymTabEntry(Class cls) { HashMap ret = new HashMap(); HashMap map = wsdlParser.getSymbolTable().getHashMap(); Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); QName key = (QName) entry.getKey(); Vector v = (Vector) entry.getValue(); int size = v.size(); for (int i = 0; i < size; ++i) { SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i); if (cls.isInstance(symTabEntry)) { ret.put(key.getLocalPart(), symTabEntry); } } } return ret; }
private Object getParamData(org.apache.axis.client.Call c, Parameter p, String arg) throws Exception { // Get the QName representing the parameter type QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p);
TypeEntry type = p.getType(); if (type instanceof BaseType && ((BaseType) type).isBaseType()) { DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType); Deserializer deserializer = factory.getDeserializerAs(Constants. AXIS_SAX); if (deserializer instanceof SimpleDeserializer) { return ((SimpleDeserializer) deserializer).makeValue(arg); } } throw new RuntimeException("not know how to convert '" + arg + "' into " + c); } }
class AppTest { public static void main(String[] args) throws Exception { System.out.println("Hello World!"); //动态调用 WebServics String location = "http://localhost:1080/axis/services/Class1Service?wsdl"; DynamicInvoker invoker = new DynamicInvoker(location); Vector vServices = invoker.enumServiceNames(); Object[] Services = vServices.toArray(); Arrays.sort(Services); for (int i = 0; i < Services.length; i++) { String serviceName = (String) Services[i]; System.out.println(serviceName); Vector V = invoker.enumPortNames(serviceName); String portName = (String) V.elementAt(0); V = invoker.enumOperationNames(serviceName, portName); Object[] OperationNames = V.toArray(); Arrays.sort(OperationNames); for (int j = 0; j < OperationNames.length; j++) { String operationName = (String) OperationNames[j]; System.out.println("\t" + (String) OperationNames[j]); Parameters parameters = invoker.enumParameters(serviceName, portName, operationName); Vector v = parameters.list; Vector parameterValues = new Vector(); for (int k = 0; k < v.size(); k++) { Parameter para = (Parameter) v.elementAt(k); System.out.print("\t\t" + para.getQName().getLocalPart()); if (para.getType().getQName().getLocalPart().equals("string")) { parameterValues.addElement("asdasdas"); } else { parameterValues.addElement(null); } System.out.print("\t" + para.getType().getQName().getLocalPart()); System.out.println("\t" + invoker.getParameterModeString(para)); } Map result = invoker.invoke(serviceName, portName, operationName, parameterValues); for (Iterator it = result.keySet().iterator(); it.hasNext();) { String name = (String) it.next(); Object value = result.get(name); String line; if (value != null) { line = name + "=" + result.get(name).toString() + "\n"; } else { line = name + "=(null)\n"; } System.out.println(line); } } }
//调用代理类调用 WebServices localhost.axis.services.Class1Service.Class1 x = new localhost.axis.services.Class1Service.Class1ServiceLocator().getClass1Service(); //((localhost.axis.services.Class1Service.Class1ServiceSoapBindingStub) x).setMaintainSession(true); System.out.println(x.sayHelloTo("萨达三 adas")); } }

|