在最近的项目过程中,需要发布一个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();
}
}