webservciescxf框架之客户端与服务端实例详解
本文参考了:http://www.webxml.com.cn/zh_cn/index.aspx
可以关注我之前发的文章,那是采用jdk发布服务并且使用wsimpor来生成客户端的。
但本文采用的是soap1.2协议,而wsimport仅对soap1.1协议有效,所以,本文采用的是
cxf框架提供的wsdl2java 来生成客户端,如下:
wsdl2java -d . http://127.0.0.1/framework?wsdl
另外,需要强调的是wsdl2java工具(axis好像也提供了)既支持soap1.1协议,也支持soap1.2协议,生成客户端代码。
如图:
此外,soap1.1与soap1.2的区别
1)命名空间不一样
soap1.1:xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
soap1.2:xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
2) 请求类型不一样
soap1.2 :Content-Type: application/soap+xml; charset=utf-8
soap1.1:Content-Type: text/xml; charset=utf-8
1)服务端cxfservices:
package com.neusoft.si;
import javax.jws.WebService; import javax.xml.ws.BindingType;
@WebService @BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class cxfservices {
public String sayHello(String name){ return "hello:"+name;
}
}
2) 发布服务端server
package com.neusoft.si;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class mycxfserver {
public static void main(String[] args) {
//soap1.1---wsimpot可以使用
//soap1.1 , soap1.2---wsdl2java -d . wsdl路径
JaxWsServerFactoryBean server=new JaxWsServerFactoryBean();
//客户端调用时,打印输入输出日志
server.getInInterceptors().add(new LoggingInInterceptor());
server.getOutInterceptors().add(new LoggingOutInterceptor());
server.setAddress("http://127.0.0.1/framework");
server.setServiceClass(cxfservices.class);
server.setServiceBean(new cxfservices());
server.create();
System.out.println("server ready");
}
}
3)客户端:
客户端生成代码根据wsdl2java生成下,此处不做展示。
package com.slrc;
import com.neusoft.si.Cxfservices;
import com.neusoft.si.CxfservicesService;
public class cxf_client {
public static void main(String[] args) {
CxfservicesService service=new CxfservicesService();
Cxfservices client=service.getCxfservicesPort();
String result=client.sayHello("jwe");
System.out.println(result);
}
}
发布带有接口的cxf服务类时需要特别注意的是@WebService注释是加在接口上的,此外,
server.setServiceClass(cxfserviceInterface.class); ----此处应为接口类
server.setServiceBean(new cxfservicesImpl()); ---此处应为接口实现类