使用CXF开发webService客户端

来源:互联网 发布:淘宝评论福利晒图 编辑:程序博客网 时间:2024/05/29 18:22

注:csdn排版太麻烦,放在git上了。
地址:https://github.com/liangjuntao/cxf_spring_struts.git

Web Service简介:
不是一种框架、更不是一种技术
而是一种跨平台、跨语言的规范
Web Wervice应用场景:
为了解决不同平台、不同语言所编写的应用之间如何调用。
如:Linux平台下用java写的程序调用win平台下c#写的应用
Web Service集中解决:
-远程调用
-跨平台调用
-跨语言调用
Web Service实际中用途:

1.同一个公司的新、旧系统的整合。
如:Linux上的java应用,去调用win平台的C#应用

2.不同公司的业务整合。
如:淘宝订单中显示的物流信息;
这个信息是物流公司提供的接口,淘宝去调用这个接口,把物流展示出来。以此把两个公司的系统整合在一起。
解决了不同公司系统平台不同,语言不同的问题。

3.内容聚合。
如:一个应用提供股票行情,外汇行情,天气预报,编程语言排行等等
这个内容聚合的应用,需要调用大量不同的平台。

……

Web Service框架:
Axis(apache) –> Axis2(apache)
XFile –>XFire + Celtrix = CXF

XFile : 本身就是一个Service框架
Celtrix:ESB框架

ESB简介:
SOA(面向服务的架构)
要点:Service1 ,Service2 ,Service3—所有组件都是“即插即用”的。
IBM提倡的SOA架构,系统以“组装电脑”的方式来开发软件。
SOA两个要素:
1.各种提供服务的组件。(Web Service)
2.企业服务总线(Enterprise Service Bus ,ESB)
注:
CXF号称是SOA框架。
CXF内置了一个jetty web服务器。

Cxf:设置环境变量
CXF_HOME=D:\ apache-cxf-2.7.18
CLASSPATH=D:\ apache-cxf-2.7.18\lib
PATH中= D:\ apache-cxf-2.7.18\bin

使用CXF开发web Service开发服务端:
每个webService组件需要两个部分:接口和实现类。
(1)开发一个web service业务接口,该接口要用@WebServicex修饰。
(2)开发一个Web Service实现类,该接口也要用@WebServicex修饰。
其中要指定两个参数:
endpointInterface :实现的接口名称
serviceName :起的service名字
(3)发布WebService

代码见下:
类结构图:
这里写图片描述

业务接口:

package com.liangjt.app.webService;import javax.jws.WebService;/** * 想要暴露出去的接口 * @author Administrator * */@WebServicepublic interface HelloWorld {    String sayHi(String name);}

实现类:

package com.liangjt.app.webService.Impl;import java.util.Date;import javax.jws.WebService;import com.liangjt.app.webService.HelloWorld;/** * 比较简单的实现类 *  * @author Administrator * */@WebService(endpointInterface = "com.liangjt.app.webService.HelloWorld", serviceName = "HelloWorld")public class HelloWorldWs implements HelloWorld {    @Override    public String sayHi(String name) {        return name + ",您好。现在时间是:" + new Date();    }}

发布:

package com.liangjt.app.main;import javax.xml.ws.Endpoint;import com.liangjt.app.webService.Impl.HelloWorldWs;/** * WsMain以RunAs java Application即可发布这个接口 *  * @author Administrator * */public class WsMain {    public static void main(String[] args) {        HelloWorldWs hw = new HelloWorldWs();        // 调用Endpoint的发布web service方法        // 第一个参数是访问的地址,第二个参数是实现类        Endpoint.publish("http://127.0.0.1/webservice", hw);        System.out.println("web Service暴露成功!");    }}

发布成功:

使用CXF开发web Service开发客户端:
(1)调用cxf调用的wsdl2java工具,根据wsdl文档生成相应的java代码。
Wsdl – web service definition language
任何语言实现了web service,都需要提供并暴露wsdl文档
(2)找到wsdl2java所生成类的中,一个继承了Service的类。
该类的实例可以当成工厂来使用。
(3)调用该类的getxxxxPort()方法。

代码如下:
注:之前的server端命名变更由ws_WebService,变化为ws_server;端口变更为9999;
(1)如图调用工具
这里写图片描述

(2)客户端项目自己建,这些代码都是调用工具生成的,所以不粘贴了

(3)生成远端代理,调用方法

package com.liangjt.app.clientMain;import com.liangjt.app.webservice.impl.HelloWorld;public class ClientMain {    public static void main(String[] args) {        HelloWorld factory = new HelloWorld();        // hw是远程web service的代理        com.liangjt.app.webservice.HelloWorld hw = factory.getHelloWorldWsPort();        System.out.println(hw.sayHi("zhangsan"));    }}

(4)运行结果

zhangsan,您好。现在时间是:Tue Jun 06 00:29:10 CST 2017

以上作为学习的总结。

期间遇到的异常:
1.accessExternalSchema属性设置的限制而不允许file访问
参考:Create a file named jaxp.properties (if it doesn’t exist) under /path/to/jdk1.8.0/jre/lib and then write this line in it:
javax.xml.accessExternalSchema = all

2.Cannot create a secure XMLInputFactory
参考:http://blog.csdn.net/java_min/article/details/9833815