1. 程式人生 > >Axis2訪問cxf釋出的webservice的引數設定問題

Axis2訪問cxf釋出的webservice的引數設定問題

在最近的專案過程中,需要釋出一個webservice給其他系統呼叫。鑑於cxf與spring的整合比較方便,所以選用cxf框架。釋出後,對方使用axis2反覆出現無法呼叫的情況。在多次查資料之後,終於解決了這個問題。我把它記錄下來,希望能給同樣在困惑的朋友們一點靈感。

關於,cxf的webservice的code和釋出就不再贅述了。這裡著重講一下,服務釋出後如何用axis2呼叫的問題。

使用axis2客戶端呼叫有兩種方式:

1.使用ServiceClient,程式碼如下:

public static void main(String[] args) {
		try {
            String soapBindingAddress = "http://localhost:8080/test/services/testService?wsdl";//訪問地址
            ServiceClient sender = new ServiceClient();
            EndpointReference endpointReference = new EndpointReference(soapBindingAddress);
            Options options = new Options();
            options.setAction("http://server.webService.test/");//指定action
            options.setTo(endpointReference);
            sender.setOptions(options);
            OMFactory fac = OMAbstractFactory.getOMFactory();
            // 這個和qname差不多,設定名稱空間
            OMNamespace omNs = fac.createOMNamespace("http://server.webService.test/",
                    "test");
            OMElement data = fac.createOMElement("test", omNs);
            // 對應引數的節點,xmlStr是引數名稱
            String[] strs = new String[] { "xmlStr" };
            // 引數值
            String[] val = new String[] { "axis2 serviceClient tester" };
            for (int i = 0; i < strs.length; i++) {
                OMElement inner = fac.createOMElement(strs[i], omNs);
                inner.setText(val[i]);
                data.addChild(inner);
            }
            // 傳送資料,返回結果
            OMElement result = sender.sendReceive(data);
            System.out.println(result.toString());
        } catch (AxisFault ex) {
            ex.printStackTrace();
        }
2.使用RPCServiceClient,程式碼如下:
public static void main(String[] args) {
		//使用RPC方式呼叫WebService          
	    RPCServiceClient serviceClient = null;
		try {
			serviceClient = new RPCServiceClient();
			Options options = serviceClient.getOptions();
			String serviceUrl = "http://localhost:8080/test/services/testService";
		    EndpointReference targetEPR = new EndpointReference(serviceUrl);  
		    options.setTo(targetEPR);
		    OMFactory fac = OMAbstractFactory.getOMFactory();
            // 這個和qname差不多,設定名稱空間
            OMNamespace omNs = fac.createOMNamespace("http://server.webService.test/",
                    "test");
            OMElement data = fac.createOMElement("test", omNs);
            // 對應引數的節點,xmlStr為引數名稱
            String[] strs = new String[] { "xmlStr" };
            // 引數值
            String[] val = new String[] { "axis2 EndpointReference tester" };
            for (int i = 0; i < strs.length; i++) {
                OMElement inner = fac.createOMElement(strs[i], omNs);
                inner.setText(val[i]);
                data.addChild(inner);
            }
            OMElement object = serviceClient.sendReceive(data);
		    System.out.println(object.toString());
		    serviceClient.cleanupTransport();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}