调用某公司的.net服务总是失败报错,最好只能用axis2生成客户端代码,然后加上红色的代码就可以了。
ReceiveStorageStub stub = new ReceiveStorageStub(); stub._getServiceClient().engageModule(org.apache.axis2.Constants.MODULE_ADDRESSING); ReceiveRealEstateStorageQueue queue = ReceiveRealEstateStorageQueue.class.newInstance(); queue.setStrBizMsgID(strBizMsgID); queue.setStrRealEstateXML(sendXml); queue.setStrRecType(strRecType); queue.setStrReportMethod(srm); returnValue = stub.receiveRealEstateStorageQueue(queue).getReceiveRealEstateStorageQueueResult();
工具类:
import java.net.URL;
import java.text.MessageFormat; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.OMNode; 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.XMLType; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.rpc.client.RPCServiceClient; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HttpTransportProperties; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; /** * * @author zy * */ public class WebServiceUtil { /** * seee#org.apache.axis.client.Call */ private static Call call = null; /** Axis2 RPCServiceClient */ private static RPCServiceClient serviceClient; /** * 格式 消息的信息. * @see java.text.MessageFormat#format(String, Object...) * * @param pattern 需要格式的字符串 * @param arguments 格式式参数 * @return 成功返回格式化后的内容, 否则不进行格式化操作 */ public static String messageFormat(String pattern, Object ... arguments) { try { return MessageFormat.format(pattern, arguments); } catch (Exception e) { return pattern; } } /** * 使用Axis Call Client动态调用WebService地址. * * @param webServiceAddr WebService地址 * @param webServiceMethod WebService方法 * @param soapActionURI SOAPActionURI * @param targetNamespace 命名空间 * @param inputValues 输入参数值 * @param inputNames 输入参数名称 * @param inputXmlTypes 输入参数XML类型 * @param inputJavaTypes 输入参数JAVA类型 * @return 成功返回<code>Object</code>, 失败或异常返回null. */ public static Object getObjectByAxisCallClient(String webServiceAddr, String webServiceMethod, String soapActionURI, String targetNamespace, Object[] inputValues, String[] inputNames, String[] inputXmlTypes, Class<?>[] inputJavaTypes) { return getObjectByAxisCallClient(webServiceAddr, webServiceMethod, soapActionURI, targetNamespace, inputValues, inputNames, inputXmlTypes, inputJavaTypes, null, null); } /** * 使用Axis Call Client动态调用WebService地址. * * @param webServiceAddr WebService地址 * @param webServiceMethod WebService方法 * @param soapActionURI SOAPActionURI * @param targetNamespace 命名空间 * @param inputValues 输入参数值 * @param inputNames 输入参数名称 * @param inputXmlTypes 输入参数XML类型 * @param inputJavaTypes 输入参数JAVA类型 * @param username 用户名(HTTP Basic Authentication) * @param password 密码(HTTP Basic Authentication) * @return 成功返回<code>Object</code>, 失败或异常返回null. */ public static Object getObjectByAxisCallClient(String webServiceAddr, String webServiceMethod, String soapActionURI, String targetNamespace, Object[] inputValues, String[] inputNames, String[] inputXmlTypes, Class<?>[] inputJavaTypes, String username, String password) { Object resObj = null; try { if (call == null) { Service service = new Service(); call = (Call) service.createCall(); } // 设置wsdl call.setTargetEndpointAddress(new URL(webServiceAddr)); // 定义参数对象 call.setUseSOAPAction(true); call.setSOAPActionURI(soapActionURI + webServiceMethod); // 设置访问的方法名 call.setOperationName(webServiceMethod); OperationDesc oper = new OperationDesc(); if (!ArrayUtils.isEmpty(inputNames)) { for (int i = 0; i < inputNames.length; i++) { // String类型 oper.addParameter(new QName(targetNamespace, inputNames[i]), new QName(targetNamespace, inputXmlTypes[i]), inputJavaTypes[i], ParameterDesc.IN, false, false); } } oper.setReturnType(XMLType.XSD_ANYTYPE); call.setOperation(oper); call.setTimeout(30000); // 访问权限验证. if (StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) { call.setUsername(username); call.setPassword(password); } resObj = call.invoke(inputValues); } catch (Exception e) { // TODO Auto/generated catch block String message = messageFormat("使用AxisCallClient调用WebService地址{{0}}方法{{1}}出现错误!", webServiceAddr, webServiceMethod); //throw new InterfaceException(message); } return resObj; } /** * 通过Axis2 取得Web Services 结果. * 可以使用身份验证(HTTP Basic Auchntication) * * @param webServiceAddr Web Service的URL地址(需要加?wsdl) * @param webServiceMethod WebService所操作的方法名称 * @param targetNamespace WebServiceNamespace * @param inputValues 对所操作方法所需要输入的参数值,如果些操作方法无参则 使用 new Object[] {},不允许输入 null * @param returnJavaTypes 指定所返回结果数据的Java Class类型数组, 如果无参数则使用 new Object[] {},不允许输入 null * @return 成功返回<code>Object[]</code>, 失败或异常返回null. */ public static Object[] geObjectByAxis2RPCClient(String webServiceAddr, String webServiceMethod, String targetNamespace, Object[] inputValues, Class<?>[] returnJavaTypes) { return geObjectByAxis2RPCClient(webServiceAddr, webServiceMethod, targetNamespace, inputValues, returnJavaTypes, null, null); } /** * 通过Axis2 取得Web Services 结果. * 可以使用身份验证(HTTP Basic Auchntication) * * @param webServiceAddr Web Service的URL地址(需要加?wsdl) * @param webServiceMethod WebService所操作的方法名称 * @param targetNamespace WebServiceNamespace * @param inputValues 对所操作方法所需要输入的参数值,如果些操作方法无参则 使用 new Object[] {},不允许输入 null * @param returnJavaTypes 指定所返回结果数据的Java Class类型数组, 如果无参数则使用 new Object[] {},不允许输入 null * @param username 用户名(HTTP Basic Auchntication) * @param password 密码(HTTP Basic Auchntication) * @return 成功返回<code>Object[]</code>, 失败或异常返回null. */ public static Object[] geObjectByAxis2RPCClient(String webServiceAddr, String webServiceMethod, String targetNamespace, Object[] inputValues, Class<?>[] returnJavaTypes, String username, String password) { Object[] resultObjArr = null; try { // 使用RPC方式调用WebService if (serviceClient == null) { serviceClient = new RPCServiceClient(); } Options options = serviceClient.getOptions(); options.setAction(targetNamespace + webServiceMethod); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(webServiceAddr); options.setTo(targetEPR); if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { //身份验证(HTTP Basic Auchntication) HttpTransportProperties.Authenticator basicAuth = new HttpTransportProperties.Authenticator(); basicAuth.setPreemptiveAuthentication(true); basicAuth.setUsername(username); basicAuth.setPassword(password); options.setProperty(HTTPConstants.AUTHENTICATE, basicAuth); } //连接超时间设置 1min. options.setTimeOutInMilliSeconds(60000); QName opAddEntry = new QName(targetNamespace, webServiceMethod); resultObjArr = serviceClient.invokeBlocking(opAddEntry, inputValues, returnJavaTypes); } catch (Exception e) { // TODO: handle exception resultObjArr = null; String message = messageFormat("使用Axis2RPCClient调用WebService地址{{0}}方法{{1}}出现错误!", webServiceAddr, webServiceMethod); //throw new InterfaceException(message); } return resultObjArr; } /** * * 用于能调用方法,参数传不过去的情况 * @param webServiceAddr Web Service的URL地址(需要加?wsdl) * @param webServiceMethod WebService所操作的方法名称 * @param targetNamespace WebServiceNamespace * @param inputValues 所操作方法的参数值 * @return */ public static Map<String, Object> getByAxis2ServiceClient(String webServiceAddr, String webServiceMethod, String targetNamespace, Object[] params, Object[] inputValues) { try { ServiceClient sender = new ServiceClient(); EndpointReference endpointReference = new EndpointReference(webServiceAddr); Options options = new Options(); options.setAction(targetNamespace + webServiceMethod); options.setTo(endpointReference); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); // 这个和qname差不多,设置命名空间 OMNamespace omNs = fac.createOMNamespace(targetNamespace, webServiceMethod); // 参数值 OMElement data = fac.createOMElement(webServiceMethod, omNs); for (int i = 0; i < params.length; i++) { OMElement inner = fac.createOMElement((String) params[i], omNs); inner.setText((String) inputValues[i]); data.addChild(inner); } // 发送数据,返回结果 OMElement result = sender.sendReceive(data); return getResults(result); } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * axis2 OMElement转map * @param element axis2 OMElement对象 * @return */ public static Map<String, Object> getResults(OMElement element) { if (element == null) { return null; } Iterator iter = element.getChildElements(); Map<String, Object> map = new HashMap<String, Object>(); while (iter.hasNext()) { OMNode omNode = (OMNode) iter.next(); if (omNode.getType() == OMNode.ELEMENT_NODE) { OMElement omElement = (OMElement) omNode; String key = omElement.getLocalName().trim(); String value = omElement.getText().trim(); map.put(key, value); } } return map; } }