D:developToolsapache-cxf-2.5.2sampleswsdl_first_dynamic_client CXF 方法 cxf方法 serviceInfo.getBindings() BindingInfo--[BindingInfo http://schemas.xmlsoap.org/wsdl/soap/] serviceInfo.getDocumentation() WS_0917_05 package com.test; import java.beans.PropertyDescriptor; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.ClientImpl; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.jaxb.JAXBUtils; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.cxf.service.model.BindingInfo; import org.apache.cxf.service.model.BindingMessageInfo; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.service.model.MessagePartInfo; import org.apache.cxf.service.model.ServiceInfo; public class Test { /** * * @throws Exception */ public static void main(String[] args) throws Exception { long begin = System.currentTimeMillis(); String namespace ="" ; String service ="BIServicesSoap"; String methodName ="Drill_WS005"; // 远程webService的URL String hostUrl = "http://172.16.66.50:8080/dswsbobje/qaawsservices/biws?wsdl=1&cuid=M1X4xPAAAHaDAPsA.AAAMzwAAqwQQjIAAAA"; methodName="Drill_WS_0917_05"; hostUrl = "http://172.16.66.50:8080/dswsbobje/qaawsservices/biws?WSDL=1&cuid=M1X6lewACbH.APsA.AAAN0AAAqwQQjIAAAA"; try { // System.getProperties().put("proxyHost", "proxy.cmcc"); // System.getProperties().put("proxyPort", "8080"); // 创建动态客户端 JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); // 创建客户端连接 URL wsdlUrl = new URL(hostUrl); Client client = factory.createClient(wsdlUrl); ClientImpl clientImpl = (ClientImpl) client; Endpoint endpoint = clientImpl.getEndpoint(); // Make use of CXF service model to introspect the existing WSDL ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0); namespace = serviceInfo.getTargetNamespace(); serviceInfo.getName().getNamespaceURI(); serviceInfo.getProperty("Operation"); Collection<EndpointInfo> ends = serviceInfo.getEndpoints(); Iterator<EndpointInfo> qeIter=ends.iterator(); while(qeIter.hasNext()){ EndpointInfo einfo= qeIter.next(); System.out.println(einfo); } System.out.println("" + serviceInfo.getEndpoints()); System.out.println("document---"+serviceInfo.getInterface()); Map<String,Object> properies= serviceInfo.getProperties(); System.out.println(properies.size()); for (String key : properies.keySet() ) { System.out.println("key--"+key+ "-----" + properies.get(key).toString()); } Set<QName> qSet=serviceInfo.getMessages().keySet(); Iterator<QName> qIter=qSet.iterator(); while(qIter.hasNext()){ QName q=qIter.next(); //包名 String packageName=JAXBUtils.namespaceURIToPackage(serviceInfo.getName().getNamespaceURI()); String className=JAXBUtils.nameToIdentifier(q.getLocalPart(),JAXBUtils.IdentifierType.INTERFACE); System.out.println(packageName+ "---className----" +className ); } String packageName=JAXBUtils.namespaceURIToPackage(serviceInfo.getName().getNamespaceURI()); Object person =Thread.currentThread().getContextClassLoader().loadClass(packageName+".LovValueIndex").newInstance(); // 创建QName来指定NameSpace和要调用的service QName bindingName = new QName(namespace, service); BindingInfo binding = serviceInfo.getBinding(bindingName); // 创建QName来指定NameSpace和要调用的方法 QName opName = new QName(namespace, methodName); BindingOperationInfo boi = binding.getOperation(opName); BindingMessageInfo inputMessageInfo = boi.getInput(); List<MessagePartInfo> parts = inputMessageInfo.getMessageParts(); // 取得对象实例 MessagePartInfo partInfo = parts.get(0); Class<?> partClass = partInfo.getTypeClass(); Object inputObject = partClass.newInstance(); ReflectUtil.setFieldValue(inputObject, "login","bwadm") ; ReflectUtil.setFieldValue(inputObject, "password","bwadmbwadm") ; // 取得字段的set方法并赋值 List<Map<String,String>> listdate = new ArrayList<Map<String,String>>(); Map<String,String> map = new HashMap<String, String>(); map.put("index", "20160901"); map.put("valueofPrompt", "111111"); listdate.add(map); ReflectUtil.setFieldValue(inputObject, "销售出库日期", listdate,serviceInfo); // 调用客户端invoke()方法,把inputObject传递给要调用的方法并取得结果对象 Object[] result = client.invoke(opName, inputObject); // 取得的结果是一个对象 Object headerGetter = ReflectUtil.getFieldValue(result[0], "headers") ; Object headerrows = ReflectUtil.getFieldValue(headerGetter, "row") ; List<?> headerlist = (List<?>) headerrows; for (int i = 0; i < headerlist.size(); i++) { Object row = headerlist.get(i); Object rowValues = ReflectUtil.getFieldValue(row, "cell") ; System.out.println(rowValues); } Object resultGetter = ReflectUtil.getFieldValue(result[0], "table") ; Object rows = ReflectUtil.getFieldValue(resultGetter, "row") ; List<?> list = (List<?>) rows; List<List<Object>> RElist = new ArrayList<List<Object>>(); for (int i =0; i<list.size();i++) { Object row = list.get(i); Object rowValues = ReflectUtil.getFieldValue(row, "cell") ; // List<Object> rowObjs = (List<Object>) rowValues; // for (int j = 0; j < rowObjs.size(); j++) { // System.out.println(rowObjs.get(j)); // } RElist.add((List<Object>) rowValues); } System.out.println(RElist); long end = System.currentTimeMillis(); System.err.println(end-begin); } catch (Exception e) { e.printStackTrace(); } } } package com.test; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.TypeVariable; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.apache.cxf.jaxb.JAXBUtils; import org.apache.cxf.service.model.ServiceInfo; public class ReflectUtil { public static Map<String,String> map = new HashMap<String, String>(); static{ map.put("login", "String.class"); map.put("password", "String.class"); map.put("resetState", "Boolean.class"); map.put("refresh", "Boolean.class"); map.put("getFromLatestDocumentInstance", "Boolean.class"); map.put("getFromUserInstance", "Boolean.class"); map.put("turnOutputToVTable", "Boolean.class"); map.put("closeDocument", "Boolean.class"); map.put("endRow", "Integer.class"); map.put("startRow", "Integer.class"); } public static void setFieldValue(Object obj , String field,String fieldValue) { Class<?> classs = obj.getClass(); try {//取有get set方法的字段 PropertyDescriptor partPropertyDescriptor = new PropertyDescriptor(field, classs); Method methodSetter = partPropertyDescriptor.getWriteMethod(); Class<?>[] paramTypes = methodSetter.getParameterTypes(); String paramType = paramTypes[0].getName(); if(paramType.equals("javax.xml.bind.JAXBElement")){ if("String.class".equals(map.get(field))){ JAXBElement<String> eleString = new JAXBElement<String>(new QName( "http://bean.cxf.hs", field), String.class, fieldValue); methodSetter.invoke(obj, eleString); }else if("Integer.class".equals(map.get(field))){ JAXBElement<Integer> eleInteger = new JAXBElement<Integer>(new QName( "http://bean.cxf.hs", field), Integer.class, Integer.valueOf(fieldValue)); methodSetter.invoke(obj, eleInteger); }else if("Boolean.class".equals(map.get(field))){ JAXBElement<Boolean> eleInteger = new JAXBElement<Boolean>(new QName( "http://bean.cxf.hs", field), Boolean.class, Boolean.valueOf(fieldValue)); methodSetter.invoke(obj, eleInteger); } } } catch (Exception e) { e.printStackTrace(); } } public static void setFieldValue(Object obj, String field, List<Map<String,String>> data ,ServiceInfo serviceinfo){ Object listObj =getFieldValue(obj,field); List<Object> list = (List<Object>) listObj; String packageName=JAXBUtils.namespaceURIToPackage(serviceinfo.getName().getNamespaceURI()); try { Class LovValueIndexClass =Thread.currentThread().getContextClassLoader().loadClass(packageName+".LovValueIndex"); for (int i = 0; i < data.size(); i++) { Map<String,String> map = data.get(i); Object vi =LovValueIndexClass.newInstance(); setFieldValue(vi,"index",map.get("index")); setFieldValue(vi,"valueofPrompt",map.get("valueofPrompt")); list.add(vi); } } catch (Exception e) { e.printStackTrace(); } } public static Object getFieldValue(Object obj, String field) { Object reObj = null; Class<?> classs = obj.getClass(); try { PropertyDescriptor resultDescriptor = new PropertyDescriptor( field, classs); reObj = resultDescriptor.getReadMethod().invoke(obj); } catch (Exception e) { try { Method[] methods = classs.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; String name = method.getName(); if (name.replace("get","").toLowerCase().equals(field.toLowerCase())) { reObj = method.invoke(obj); } } } catch (Exception e1) { e1.printStackTrace(); } } return reObj; } }