eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)

本篇博客主要包含五个内容:

1.CXF换将搭建以及eclipse配置CXF。

2.eclipse创建webservice服务端。

3.eclipse创建webservice客户端访问webservice服务端。

4.使用Android studio创建webservice客户端APP访问服务端。

5.开发过程中可能出现的一些错误。

(后两个方面在下一篇博客中,详情见末尾。)

各工具版本号:

Eclipse:Eclipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2)。

Jdk:1.7.0_60,64位,

Tomcat:apache-tomcat-7.0.47。

Android studio:目前最新版:Android studio 3.0.1。

闲话少叙,直奔主题。

1.CXF环境搭建以及eclipse配置CXF

从Apache官网 http://cxf.apache.org/download.html 下载CXF压缩包,我下载的是3.1.14版本的,

这是下载链接:

http://www.apache.org/dyn/closer.lua/cxf/3.1.14/apache-cxf-3.1.14.zip

下载好之后配置CXF的环境变量,解压下载的压缩包,根据自己的路径配置环境变量,楼主是下面的路径,

在CLASSPATH中添加 D:\Java\apache-cxf-2.7.5\lib,

新建CXF_HOME,值为 D:\Java\apache-cxf-2.7.5,

在PATH中添加 D:\Java\apache-cxf-2.7.5\bin,

配置好之后,在eclipse的Windows->prerferences中找到webservice->CXF 2.*,然后配置,指向cxf文件夹的路径,

环境配置完成。

2.Eclipse创建webservice服务端

先介绍操作,再介绍原理。

Eclipse中新建动态web项目,Dyanmic web modult version选择2.5,3.0版本的好像后面使用cxf时会出现问题,Configuration选择CXF***,然后下一步,

这里勾选创建web.xml文件,

再下一步,能看到刚才的CXF配置的环境,然后点击完成。

动态项目创建完成之后,我的目录结构为:

下面贴代码:

接口SayHelloService.java

  1. package com.diy.dao;
  2.  
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebParam;
  5. import javax.jws.WebResult;
  6. import javax.jws.WebService;
  7.  
  8. @WebService(targetNamespace = "http://dao.diy.com", serviceName = "SayHelloService")
  9. public interface SayHelloService {
  10.  
  11.    @WebResult(name = "return", targetNamespace = "http://dao.diy.com")
  12.    @WebMethod(action = "http://dao.diy.com/sayHello")
  13.    public String sayHello(@WebParam(name = "arg0", targetNamespace = "http://dao.diy.com") String arg0);
  14. }

实现类SayHelloServiceImpl.java

  1. package com.diy.dao;
  2.  
  3. public class SayHelloServiceImpl implements SayHelloService {
  4.  
  5.    public String sayHello(String arg0) {
  6.       return "Hello:" + arg0;
  7.    }
  8. }

主类Server.java

  1. package com.diy.dao;
  2.  
  3. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  4.  
  5. public class Server {
  6.    public static void main(String[] args) {
  7.       System.out.println("开启webservice。。。");
  8.       SayHelloService sayHelloService = new SayHelloServiceImpl();
  9.       String address = "http://10.201.23.77:8080/web";
  10.       JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
  11.       factoryBean.setAddress(address); // 设置暴露地址
  12.       factoryBean.setServiceClass(SayHelloService.class); // 设置接口类
  13.       factoryBean.setServiceBean(sayHelloService); // 设置实现类
  14.       factoryBean.create();
  15.       System.out.println("开启webservice成功。。。");
  16.    }
  17. }

在主类中右击run as ->Java application,如果开启失败,在任务管理器中关闭已经开启的Java进程,这是我的开启webservice服务成功界面:

  1. 开启webservice。。。
  2. 一月 03, 2018 1:05:02 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
  3. 信息: Creating Service {http://dao.diy.com}SayHelloService from class com.diy.dao.SayHelloService
  4. 一月 03, 2018 1:05:03 下午 org.apache.cxf.endpoint.ServerImpl initDestination
  5. 信息: Setting the server's publish address to be http://10.201.23.77:8080/web
  6. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.util.log.Log initialized
  7. 信息: Logging initialized @1590ms
  8. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.Server doStart
  9. 信息: jetty-9.2.22.v20170606
  10. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.AbstractHandler doStart
  11. 警告: No Server set for org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@88a3523
  12. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.AbstractConnector doStart
  13. 信息: Started ServerConnector@79de7e39{HTTP/1.1}{10.201.23.77:8080}
  14. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.Server doStart
  15. 信息: Started @1746ms
  16. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.ContextHandler setContextPath
  17. 警告: Empty contextPath
  18. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.ContextHandler doStart
  19. 信息: Started o.e.j.s.h.ContextHandler@5abe12e3{/,null,AVAILABLE}
  20. 一月 03, 2018 1:05:03 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
  21. 信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}Discovery from WSDL: classpath:/org/apache/cxf/ws/discovery/wsdl/wsdd-discovery-1.1-wsdl-os.wsdl
  22. 一月 03, 2018 1:05:03 下午 org.apache.cxf.endpoint.ServerImpl initDestination
  23. 信息: Setting the server's publish address to be soap.udp://239.255.255.250:3702
  24. 一月 03, 2018 1:05:05 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
  25. 信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}DiscoveryProxy from class org.apache.cxf.jaxws.support.DummyImpl
  26. 开启webservice成功。。。

开启成功之后,在浏览器地址栏中输入:服务发布地址+?wsdl,比如我这里就是 http://10.201.23.77:8080/web?wsdl ,回车之后,出现服务的wsdl描述。

出现这些描述信息之后,就表示webservice服务已经发布成功。

理论介绍:

Soapaction:在接口名上面,使用注解:

@WebService(targetNamespace = "http://dao.diy.com", serviceName = "SayHelloService"),targetnamespace的值就是包名倒写,

指明这是一个webservice服务,

在方法名上使用注解:

@WebResult(name = "return", targetNamespace = "http://dao.diy.com")

@WebMethod(action = "http://dao.diy.com/sayHello") ,

webresult指明返回结果,webmethod指明这是一个服务端的方法,其中的action对应soapaction,如果这里不写action,soapaction的值为空,客户端运行时,会报错,错误原因差不多是找不到方法名。接口中的每一个注解都不可缺少,否则客户端运行报错。

下面介绍eclipse创建webservice客户端。

3.eclipse创建webservice客户端来访问服务端

先介绍操作,再介绍原理。

使用eclipse创建一个Java项目,命名为webservice2client,

然后进到这个Java项目的根目录àsrc目录下,我的是这样的: D:\javaeeworkspace\webservice2client\src ,

进入之后,打开命令行,进到这个src目录下,然后输入 wsdl2java http://10.201.23.77:8080/web?wsdl ,(根据自己的发布地址修改代码,最后加一个?wsdl即可),回车,稍等几秒会生成一个文件夹,

即生成客户端代码,生成之后,在eclipse中刷新项目,查看那个接口类文件,可能targetnamespace会缺少信息,

在这里填写图中下面一行的targetNamespace值即可(我上一个demo项目中就不存在这个问题,这个不知道为什么),

新建一个Client类,代码为:

  1. package com.diy.dao;
  2.  
  3. public class Client {
  4.  
  5.    public static void main(String[] args) {
  6.       System.out.println("开始获取数据。。。");
  7.       SayHelloService_Service service = new SayHelloService_Service();
  8.       SayHelloService sayHelloService = service.getSayHelloServicePort();
  9.       System.out.println(sayHelloService.sayHello(""));
  10.       System.out.println("获取完成。");
  11.    }
  12.  
  13. }

右击运行,

Webservice客户端运行成功。

接下来是一些理论类描述:

关于命令行中使用wsdl2java 命令,打开一开始解压的CXF文件夹的bin目录,可以看到

这里是包含wsdl2Java命令的,所以在添加了cxf的环境变量之后,可以直接使用这个命令生成客户端代码,如果不使用wsdl2Java这个命令的话,也可以使用 jdk自带的生成客户端代码的命令, wsimport.exe 工具,详情可以参考 http://blog.csdn.net/tianma630/article/details/8231224 这个网址,介绍很详细。

剩下的两个方面,请查看个人的下一篇博客 : eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二)

新增demo源码下载地址:链接:https://pan.baidu.com/s/1sm1w3ud  密码:0n40,链接失效的话,请评论区留言个人百度账号,给你分享一下。

如果你能从这篇文章中获得一丁点对自己有用的信息,那这篇文章就是值得的;如果确实帮助了你,麻烦动一下鼠标,请点击推荐,

另外由于编者水平有限,文章中如有不妥之处或者有什么疑问,可直接在下面评论指出,不胜感激。