博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用cxf构建webservice
阅读量:7052 次
发布时间:2019-06-28

本文共 6299 字,大约阅读时间需要 20 分钟。

一、简介

  cxf是apache下的一个开源的,功能齐全的WebService框架。是由Celtix和XFire两个开源框架组合而成。cxf可以帮助我们使用前端编程模型构建和开发服务,如JAX- WS和JAZ-RS。这些服务可以使用不同的协议,如SOAP,XML/HTTP,RESTFul HTTP或者CORBA和使用各种的数据传输协议,如HTTP,JMS 和JBI。除此之外cxf还有如下特性:

  • 使用简单,可与maven,spring等进行集成。
  • 支持Web Service标准,包括soap,WS-I Basic Profile, WSDL, WS-Addressing, WS-Policy, WS-ReliableMessaging, WS-Security, WS-SecurityPolicy, WS-
  • SecureConverstation, 和WS-Trust (partial)。
  • 对二进制和遗留协议的支持,cxf设计并提供了一个可插拔的架构,不仅支持xml还支持非xml类型的绑定,如json,corba。可使用多种类型格式进行传输。
  • 提供了多中工具生成代码,如WSDL to JAVA, WSDL to JavaScript, Java to JavaScript等。

二、使用

  cxf的下载地址如下: 。这里下载的是windows版本apache-cxf-3.0.3.zip。在c盘根目录下解压该文件,解压后文件目录结构如下:

  

其中bin目录下的是为我们提供的相关转换工具,docs目录下的是相关文档,lib目录下是cxf的jar依赖;license目录下的是许可,samples是为我们提供的例子。

  新建一个java项目cxf_server,并将lib下的jar文件(不包括endorse,和integration目录)添加到项目的依赖。

  1、编写MyService接口 代码如下:

1 package com.cxf.testauto;2 3 import javax.jws.WebService;4 5 @WebService6 public interface MyService {7 8     public String sayHello(String username, String address, String school); 9 }

  2、编写MyService的实现类

package com.cxf.testauto;public class MyServiceImpl implements MyService {    @Override    public String sayHello(String username, String address, String school) {        System.out.println("sayHello is invoked!");        String result = "hello: " + username + ", your info is: " + address + ", " + school;        return result;    } }

  3、Server 服务的启动类

package com.cxf.testauto;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class Server {    public static void main(String[] args) {        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();        factory.setAddress("http://localhost:9000/myservice");        factory.setServiceClass(MyServiceImpl.class);        factory.getInInterceptors().add(new LoggingInInterceptor());        factory.getOutInterceptors().add(new LoggingOutInterceptor());        factory.create();    }}

  主要:如果jdk版本比较低会报java.lang.LinkageError: JAXB 2.0 API jar is being loaded, but this RI (...) needs 2.2 API.类似的错误。此时需要在运行该类的时候指定运行参数,打开Run Configurations窗口,在VM arguments输入如下参数:

-Djava.ext.dirs=C:\apache-cxf-3.0.3\lib\endorsed

  表示指定jvm运行的时候,加载C:\apache-cxf-3.0.3\lib\endorsed目录下的jar文件。如下图所示

  

  点击Apply,运行即可。

  4、运行Server类

  启动成功后,我们可以通过浏览器访问wsdl文件,使用http://localhost:9000/myservice?wsdl 地址访问即可。wsdl文件内容如下:

1 
2
6
7
10 11
12
13 14
15
16
17
18
19
20
21 22
23
24
25
26
27 28
29
30 31
32
33
34
35
36
37
38
39 40
41
42
43
44
45
46
47
48 49
50
52
53
54
55
56
57
58
59
60
61
62 63
64
66
67
68
69

  5、通过wsdl文件生成客户端

  将C:\apache-cxf-3.0.3\bin 添加进系统环境变量path中。

  cmd进入c盘根目录,运行命令

C:\>wsdl2java -client -encoding utf8 -frontend jaxws21 http://localhost:9000/myservice?wsdl

  该命令根据wsdl生产调用的客户端。-client表示生成客户端;-encoding表示生成的java代码的编码格式;frontend表示参照jaxws21标准;ttp://localhost:9000/myservice?wsdl为wsdl的地址,也可以是磁盘上的某一个wsdl文件。

  执行结果如下:

  命令执行成功后将会在c盘根目录下生成客户端的调用代码:生成的代码结构如下

 

  我们主要使用到的就是MyService_MyServiceImplPort_Client.java这个调用类。

  6、进行调用,新建另一个java工程cxf_client,将生成的客户端代码拷贝到这个工程中。并对MyService_MyServiceImplPort_Client.java类进行修改。
  MyService_MyServiceImplPort_Client.java修改后的内容如下:

package com.cxf.testauto;/** * Please modify this class to meet your needs * This class is not complete */import java.io.File;import java.net.MalformedURLException;import java.net.URL;import javax.xml.namespace.QName;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.bind.annotation.XmlSeeAlso;import javax.xml.ws.RequestWrapper;import javax.xml.ws.ResponseWrapper;/** * This class was generated by Apache CXF 3.0.3 * 2015-01-13T13:58:38.847+08:00 * Generated source version: 3.0.3 *  */public final class MyService_MyServiceImplPort_Client {    private static final QName SERVICE_NAME = new QName("http://testauto.cxf.com/", "MyServiceImplService");    private MyService_MyServiceImplPort_Client() {    }    public static void main(String args[]) throws java.lang.Exception {        URL wsdlURL = MyServiceImplService.WSDL_LOCATION;        if (args.length > 0 && args[0] != null && !"".equals(args[0])) {             File wsdlFile = new File(args[0]);            try {                if (wsdlFile.exists()) {                    wsdlURL = wsdlFile.toURI().toURL();                } else {                    wsdlURL = new URL(args[0]);                }            } catch (MalformedURLException e) {                e.printStackTrace();            }        }              MyServiceImplService ss = new MyServiceImplService(wsdlURL, SERVICE_NAME);        MyService port = ss.getMyServiceImplPort();                  {        System.out.println("Invoking sayHello...");        java.lang.String _sayHello_arg0 = "zhangsan";        java.lang.String _sayHello_arg1 = "beijing";        java.lang.String _sayHello_arg2 = "hello world";        java.lang.String _sayHello__return = port.sayHello(_sayHello_arg0, _sayHello_arg1, _sayHello_arg2);//对webservice 接口进行调用        System.out.println("sayHello.result=" + _sayHello__return);        }        System.exit(0);    }}

  运行该类,完成调用。

  client端打印的结果如下:

  server端打印的结果如下:

  

转载于:https://www.cnblogs.com/always-online/p/4221191.html

你可能感兴趣的文章
handler 机制
查看>>
解决mysql无法导入本地文件的问题
查看>>
HBase 系统架构
查看>>
RichFace标签学习笔记
查看>>
iOS中block介绍(四)揭开神秘面纱(下)
查看>>
更改yum源为阿里云的yum源
查看>>
解决exchang服务器连接不可用问题
查看>>
Tomcat启动权限
查看>>
一步一步學習partitions之hash partitions
查看>>
POJ 1061 青蛙的约会 扩展欧几里得
查看>>
我的友情链接
查看>>
随笔-ftp文件上传,删除
查看>>
Ansible问题汇总
查看>>
linux上部署hadoop集群 基础篇
查看>>
java中堆(heap)和堆栈(stack)
查看>>
H3C 5500/5820 端口聚合LACP
查看>>
我的友情链接
查看>>
Forefront TMG 服务器中如何规划和实现高可用性
查看>>
Exchange Server 2010 故障分享
查看>>
java正则匹配count字符串
查看>>