Apache CXF实现的SOAP形式的webservices

简介:

一 建项目,导jar包

(1)项目结构

wKioL1cKUAPiI8TiAAA4VVm9CRU924.png


(2)在eclipse中新建一个动态web项目“CXFDemo”,并导入cxf中的jar包(路径:/WEB-INF/lib/)。当然,可以去官网下载,也可以直接使用我用过的jar包,链接:http://pan.baidu.com/s/1pKyelAV

(3)配置web.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< web-app  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xmlns = "http://java.sun.com/xml/ns/javaee"
     xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version = "3.0" >
     < display-name >CXFDemo</ display-name >
     < context-param >
         < param-name >contextConfigLocation</ param-name >
         < param-value >WEB-INF/classes/service-beans.xml</ param-value >
     </ context-param >
     < listener >
         < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class >
     </ listener >
     < servlet >
         < servlet-name >CXFServlet</ servlet-name >
         < servlet-class >org.apache.cxf.transport.servlet.CXFServlet</ servlet-class >
     </ servlet >
     < servlet-mapping >
         < servlet-name >CXFServlet</ servlet-name >
         < url-pattern >/*</ url-pattern >
     </ servlet-mapping >
     < welcome-file-list >
         < welcome-file >index.html</ welcome-file >
         < welcome-file >index.htm</ welcome-file >
         < welcome-file >index.jsp</ welcome-file >
         < welcome-file >default.html</ welcome-file >
         < welcome-file >default.htm</ welcome-file >
         < welcome-file >default.jsp</ welcome-file >
     </ welcome-file-list >
</ web-app >


二 web service服务端类

(1)接口CXFService.java:

1
2
3
4
5
6
7
8
9
10
11
package  cn.zifangsky;
 
import  javax.jws.WebMethod;
import  javax.jws.WebParam;
import  javax.jws.WebService;
 
@WebService
public  interface  CXFService {
     @WebMethod
     public  String sayHello( @WebParam (name= "name" ) String name);
}

说明:
@WebService:标记表示该接口是一个WebService服务
@WebMethod:标记表示WebService中的方法
@WebParam(name=”paramName”)表示方法中的参数,name属性限制了参数的名称,若没有指定该属性,参数将会被重命名

(2)具体的实现类CXFServiceImpl.java:

1
2
3
4
5
6
7
8
9
10
11
package  cn.zifangsky.impl;
 
import  cn.zifangsky.CXFService;
 
public  class  CXFServiceImpl  implements  CXFService {
     
     public  String sayHello(String name) {
         return  "Hello,"  + name +  "\n"  + Test.getExtraMessage();
     }
 
}

注:Test.java类:

1
2
3
4
5
6
7
package  cn.zifangsky.impl;
 
public  class  Test {
     public  static  String getExtraMessage(){
         return  "测试" ;
     }
}

(3)配置service-beans.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< beans  xmlns = "http://www.springframework.org/schema/beans"
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"  xmlns:jaxws = "http://cxf.apache.org/jaxws"  xmlns:soap = "http://cxf.apache.org/bindings/soap"
     xsi:schemaLocation="  
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd  
     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
     
     < bean  id = "outLoggingInterceptor"  class = "org.apache.cxf.interceptor.LoggingOutInterceptor"  />
     < bean  id = "loggingFeature"  class = "org.apache.cxf.feature.LoggingFeature"  />
     < bean  id = "inLoggingInterceptor"  class = "org.apache.cxf.interceptor.LoggingInInterceptor"  />
     < jaxws:server  id = "sayHelloServices"  serviceClass = "cn.zifangsky.CXFService"  address = "/soap/sayHello"  >
         < jaxws:serviceBean >
             < bean  class = "cn.zifangsky.impl.CXFServiceImpl"  />
         </ jaxws:serviceBean >
         < jaxws:outInterceptors >
             < ref  bean = "outLoggingInterceptor"  />
         </ jaxws:outInterceptors >
         < jaxws:inInterceptors >
             < ref  bean = "inLoggingInterceptor"  />
         </ jaxws:inInterceptors >
         < jaxws:features >
             < ref  bean = "loggingFeature"  />
             < wsa:addressing  xmlns:wsa = "http://cxf.apache.org/ws/addressing"  />
         </ jaxws:features >
         
     </ jaxws:server >
         
</ beans >

说明:

i)3个bean配置的是日志,在这里把日志相关的配置删掉也不影响web service服务的正常使用

ii)address指的是发布后这个服务的路径问题,比如说我这里就是:http://localhost:8080/CXFDemo/soap/sayHello

(4)测试

发布这个项目到tomcat,运行之后的效果如下:

wKioL1cKULbSOMPAAAA-e5SuiHc509.png

点击那个链接,可以发现sayHello这个服务的地址是:http://localhost:8080/CXFDemo/soap/sayHello?wsdl

到此,这个web service的服务端已经配置完成


三 web service客户端配置

服务端提供服务,而客户端使用服务端提供的服务,因此客户端只需要调用服务端提供的服务就可以了

(1)客户端的项目结构:

wKioL1cKUOWRR2GiAAAtfhKE4Tg645.png

(2)同样是新建一个动态web工程,然后引入cxf的jar包,同时需要把服务端的CXFService接口打包成一个jar包,然后导入到客户端的lib中,链接:http://pan.baidu.com/s/1eQVWups

wKiom1cKUF7QAMy_AAB6UBqzXRY701.png

(3)客户端测试类ClientDemo.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package  cn.zifangsky.client;
 
import  org.springframework.context.support.ClassPathXmlApplicationContext;
 
import  cn.zifangsky.CXFService;
 
public  class  ClientDemo {
     public  static  void  main(String args[]){
         ClassPathXmlApplicationContext context =  new  ClassPathXmlApplicationContext( new  String[] { "client-beans.xml" });
         
         CXFService clientHello = (CXFService) context.getBean( "clientHello" );
         String response = clientHello.sayHello( "javaee" );
         context.close();
         
         System.out.println( "Response: "  + response);   
         System.exit( 0 );  
    
     
}

(4)客户端配置文件client-beans.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<? xml  version = "1.0"  encoding = "UTF-8" ?>  
< beans  xmlns = "http://www.springframework.org/schema/beans"   
        xmlns:jaxws = "http://cxf.apache.org/jaxws"   
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans.xsd   
           http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
          
     < bean  id = "outLoggingInterceptor"  class = "org.apache.cxf.interceptor.LoggingOutInterceptor"  />
     < bean  id = "loggingFeature"  class = "org.apache.cxf.feature.LoggingFeature"  />
     < bean  id = "inLoggingInterceptor"  class = "org.apache.cxf.interceptor.LoggingInInterceptor"  />      
     < jaxws:client  id = "clientHello"  serviceClass = "cn.zifangsky.CXFService"  address = "http://localhost:8080/CXFDemo/soap/sayHello?wsdl" >
         < jaxws:inInterceptors >
             < ref  bean = "inLoggingInterceptor"  />
         </ jaxws:inInterceptors >
         < jaxws:outInterceptors >
             < ref  bean = "outLoggingInterceptor"  />
         </ jaxws:outInterceptors >
         < jaxws:features >
             < ref  bean = "loggingFeature"  />
             < wsa:addressing  xmlns:wsa = "http://cxf.apache.org/ws/addressing"  />
         </ jaxws:features >
     </ jaxws:client >   
</ beans >

说明:

这里的address需要填写服务的wsdl绝对地址,因此这里就是:http://localhost:8080/CXFDemo/soap/sayHello?wsdl


(5)测试

直接使用“Java Application”运行ClientDemo,输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---------------------------
ID: 1
Address: http://localhost:8080/CXFDemo/soap/sayHello?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><Action xmlns="http://www.w3.org/2005/08/addressing">http://zifangsky.cn/CXFService/sayHello</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:0d855e41-d638-4525-a3cf-8055c40f8605</MessageID><To xmlns="http://www.w3.org/2005/08/addressing">http://localhost:8080/CXFDemo/soap/sayHello?wsdl</To><ReplyTo xmlns="http://www.w3.org/2005/08/addressing"><Address>http://www.w3.org/2005/08/addressing/anonymous</Address></ReplyTo></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://zifangsky.cn/"><name>javaee</name></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
三月 14, 2016 4:51:41 下午 org.apache.cxf.services.CXFServiceService.CXFServicePort.CXFService
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Date=[Mon, 14 Mar 2016 08:51:41 GMT], Server=[Apache-Coyote/1.1], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><Action xmlns="http://www.w3.org/2005/08/addressing">http://zifangsky.cn/CXFService/sayHelloResponse</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:504f4c19-5df9-42bd-bb02-761da4932490</MessageID><To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To><RelatesTo xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:0d855e41-d638-4525-a3cf-8055c40f8605</RelatesTo></soap:Header><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://zifangsky.cn/"><return>Hello,javaee
测试</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------
三月 14, 2016 4:51:41 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@62a76581: startup date [Mon Mar 14 16:51:39 GMT+08:00 2016]; root of context hierarchy
Response: Hello,javaee
测试

可以发现,最后成功输出了

1
2
Response: Hello,javaee
测试

因为我们在客户端中只引用了CXFService.java这个接口,但是却输出了预期的内容,说明客户端的确是调用了服务端的服务并成功返回信息的




本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1762434,如需转载请自行联系原作者
相关文章
|
6月前
|
Java API Apache
Apache CXF生成WebService的客户端
Apache CXF生成WebService的客户端
227 0
|
运维 Kubernetes Cloud Native
MSE 支持 Apache Shenyu 网关实现全链路灰度
我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。
570 6
MSE 支持 Apache Shenyu 网关实现全链路灰度
|
监控 Java 关系型数据库
Apache Flume-自定义 source(扩展)--功能测试实现|学习笔记
快速学习 Apache Flume-自定义 source(扩展)--功能测试实现
 Apache Flume-自定义 source(扩展)--功能测试实现|学习笔记
|
运维 Kubernetes Cloud Native
MSE支持Apache Shenyu网关实现全链路灰度
微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。
MSE支持Apache Shenyu网关实现全链路灰度
|
弹性计算 前端开发 JavaScript
在阿里云ECS上配置Apache+wsgi实现blog的部署
利用Django框架搭建个人博客网站,将网站通过Apache+wsgi部署到阿里云服务器。主要采用html、css、javascript作为前端,并使用了JQuery框架和Bootstrap框架;采用django框架作为后台开发技术、后台数据库使用mysql。本篇幅着重于Django框架介绍、数据库mysql配置和服务器部署。
在阿里云ECS上配置Apache+wsgi实现blog的部署
|
关系型数据库 MySQL 数据挖掘
使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris
本文通过实例来演示怎么通过Flink CDC 结合Doris的Flink Connector实现从Mysql数据库中监听数据并实时入库到Doris数仓对应的表中。
3329 0
使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris
|
存储 Java Apache
java积累——apache commons fileupload 实现文件上传
java积累——apache commons fileupload 实现文件上传
366 0
|
网络安全 Apache 数据安全/隐私保护
phpstudy集成下Apache配置SSL证书实现https加密访问
phpstudy集成下Apache配置SSL证书实现https加密访问
|
JavaScript Apache 开发者
通过 express 模拟 Apache 实现静态资源托管服务(补充)|学习笔记
快速学习通过 express 模拟 Apache 实现静态资源托管服务(补充)
|
JSON JavaScript Apache
通过 express 模拟 Apache 实现静态资源托管服务|学习笔记
快速学习通过 express 模拟 Apache 实现静态资源托管服务

推荐镜像

更多