用axis调用webservice

本人测试过的小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改成您对应的接口参数名。

 



 

你可能感兴趣的:(webservice,axis)