本人测试过的小demo,用axis调用webservice实现,下面为代码:
服务端方法代码为:
public String handler(String name){
return "我的名字是:"+name;
}
客户端调用代码为:
public static void main(String[] args) {
try{
String url = "http://localhost:9001/Service/ServiceTest.jws?wsdl";
String space = "http://service.zhan.com/";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(url));
call.setUseSOAPAction(true);
call.setOperationName(new QName(space,"handler"));
call.addParameter(new QName(space,"name"), XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
String response = (String) call.invoke(new Object[]{"Brookes"});
System.out.println("return value is: " + response);
}catch (Exception ex){
ex.printStackTrace();
}
}
结果一运行结果为:return value is: 我的名字是:null //方法是调通了,但是没有接收到哦参数,。。
后来研究出来了:把call.addParameter(new QName(space,"name"), XMLType.XSD_STRING, ParameterMode.IN);修改为
call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); 就可以了。
运行后结果为:return value is: 我的名字是:Brookes
这是为什么呢?
结合SoapUI分析发现,如果jws通过annotation来发布,或者类似方式,通过axis调用,需要注意两点:
1)在call.setOperationName是必须通过Qname来制定namespaceURI
2)在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义,也不需制定namespaceURI,
为什么服务端的参数好端端的变为arg0-arg9呢,参数变了很不好啊。服务端需要写什么来解决这个问题啊?
方法如下:
到 WebRoot/WEB-INF/wsdl下,找到你项目对应的****.xsd文件,将其中arg0-arg9改成您对应的接口参数名。