基于JAX-WS调用Web Service的Java客户端一般采用两种方式:proxy方式以及dispatch方式。
proxy方式,proxy的步骤主要如下图所示:
2,初始化Service,指定wsdL URL和service的QName,service的QName的前一部分是命名空间,后一部分是名称,与WSDL文件中的<wsdl:service name="WSCXFProviderService">部分对应。然后通过getPort得到一个实现了SEI的实例,这个实例被叫做Proxy。它的QName与 wsdl文件中的<wsdl:port name="WSCXFProviderPort"部分对应。
3,通过SEI调用web service,传给SEI的参数是加上JAXB annotation的java类(简单类型和String不用标记)。
4,传入的参数被序列化为SOAP消息的payload(body部分的xml),这是因为service.getPort是通过proxy机制创建的,调用这个proxy的方法时,和它关联的InvocationHandler的invoke方法也会执行,invoke方法会通过JAXB把java参数序列化为XML。然后会把soap request发到服务器端。
5,返回response是后与4类似,InvocationHandler负责把XML利用JAXB反序列化为java对象。
在payload方式中,客户端需要关心的是 SOAP消息中的body部分,可以通过把带有JAXB注解的Java对象或者XML source两种方法传递给dispatch来调用Web service。
1,payload方式通过JAXB Java对象:
示例代码:
proxy方式,proxy的步骤主要如下图所示:
一,proxy方式的调用代码片段一般如下:
URL wsdlURL = new URL("file:///D:/JAVAWorkspace/Test/WSClient/src/wsdl/prjCXFWeb.wsdl");
QName serviceQName = new QName("http://test.cxf.bt.com/", "WSCXFProviderService");
QName portQName = new QName("http://test.cxf.bt.com/", "WSCXFProviderPort");
Service service = Service.create(wsdlURL, serviceQName);
WSCXFProvider port = (WSCXFProvider) service.getPort(portQName, WSCXFProvider.class);
try{
System.out.println(port.testWS("message"));
}catch(SOAPFaultException e){
System.out.println(e.getFault().getFaultCode());
System.out.println(e.getFault().getFaultString());
}
1,用工具通过WSDL文件产生一个SEI(service endpoint interface),一个java的interface,能够对应该web service提供的功能。这个interface的类名会对应到WSDL的portType名称,方法会和operation对应,方法的参数会和message以及types对应。CXF和Axis都提供这样的工具:wsdl2java。【上面的WSCXFProvider就是SEI】
2,初始化Service,指定wsdL URL和service的QName,service的QName的前一部分是命名空间,后一部分是名称,与WSDL文件中的<wsdl:service name="WSCXFProviderService">部分对应。然后通过getPort得到一个实现了SEI的实例,这个实例被叫做Proxy。它的QName与 wsdl文件中的<wsdl:port name="WSCXFProviderPort"部分对应。
3,通过SEI调用web service,传给SEI的参数是加上JAXB annotation的java类(简单类型和String不用标记)。
4,传入的参数被序列化为SOAP消息的payload(body部分的xml),这是因为service.getPort是通过proxy机制创建的,调用这个proxy的方法时,和它关联的InvocationHandler的invoke方法也会执行,invoke方法会通过JAXB把java参数序列化为XML。然后会把soap request发到服务器端。
5,返回response是后与4类似,InvocationHandler负责把XML利用JAXB反序列化为java对象。
二,Dispatch方式:dispatch有payload方式和message方式。
在payload方式中,客户端需要关心的是 SOAP消息中的body部分,可以通过把带有JAXB注解的Java对象或者XML source两种方法传递给dispatch来调用Web service。
1,payload方式通过JAXB Java对象:
示例代码:
// create Service
U