Spring和cxf3的整合,以maven的方式
一、引入cxf3
我这里使用的是最新的版本cxf3.1.8
引入cxf3需要在pom.xml加入如下内容:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.8</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.8</version>
</dependency>
二、项目中增加对cxf3的支持
1、修改web.xml,增加如下内容不:
<!-- cxf webservices -->
<servlet>
<description>CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
2、添加spring的配置文件application-cxf.xml,内容如下(web.xml中扫描spring配置文件需要增加对这个配置文件的扫描):
<?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"
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"> <import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- Cxf WebService 服务端示例 -->
<jaxws:endpoint id="DemoWebservice" implementor="com.comp.web.webservice.impl.DemoWebserviceImpl" address="/demo"/> <!-- Cxf WebService 客户端示例 -->
<jaxws:client id="demoClient" serviceClass="com.comp.web.webservice.DemoWebservice" address="http://localhost:8080/App/services/demo?wsdl" /> </beans>
注意看上面有服务端以及客户端的示例声明,下面会给出编写服务端及客户端的具体代码
三、编写服务端代码
1、application-cxf.xml文件中添加声明:
<!-- Cxf WebService 服务端示例 -->
<jaxws:endpoint id="DemoWebservice" implementor="com.comp.web.webservice.impl.DemoWebserviceImpl" address="/demo"/>
2、接口文件DemoWebservice.java,代码如下:
package com.huarui.web.webservice; import javax.jws.WebService; @WebService
public interface DemoWebservice { public String queryBaseTx(); public String queryBaseTxById(String id);
}
3、实现文件DemoWebserviceImpl.java,代码如下:
package com.comp.web.webservice.impl; import java.util.List; import javax.jws.WebService; import org.springframework.beans.factory.annotation.Autowired; import com.google.gson.Gson;
import com.comp.mapping.entity.BasetxEntity;
import com.comp.service.jdbc.BasetxService;
import com.comp.web.webservice.DemoWebservice; @WebService(endpointInterface = "com.comp.web.webservice.DemoWebservice")
public class DemoWebserviceImpl implements DemoWebservice { @Autowired
private BasetxService basetxService; public String queryBaseTx() {
List list = basetxService.findAll();
return new Gson().toJson(list);
} public String queryBaseTxById(String id) {
BasetxEntity basetx = basetxService.findById(id);
return new Gson().toJson(basetx);
} }
重启项目,用这个地址就可以访问我们创建的服务列表了 http://localhost:8080/App/services/
对于我们刚才创建的服务的访问地址为:http://localhost:8080/App/services/demo?wsdl
路径中services对应的是web.xml文件中配置的内容
demo?wsdl对应的是application-cxf.xml文件中的address属性
四、编写客户端代码
1、application-cxf.xml文件中添加声明:
<!-- Cxf WebService 客户端示例 -->
<jaxws:client id="demoClient" serviceClass="com.comp.web.webservice.DemoWebservice" address="http://localhost:8080/App/services/demo?wsdl" />
2、controller类中,添加如下代码:
@Autowired
@Qualifier("demoClient")
private DemoWebservice demo; ...... String result = demo.queryBaseTx();
System.out.println(result);
com.comp.web.webservice.DemoWebservice是基于服务端的接口实现,本来是要重新写的,我这里偷了个懒,直接用了服务端的代码
Qualifier注解里面的demoClient对应的是application-cxf.xml配置里面jaxws:client标签的id属性
com.comp.web.webservice.DemoWebservice是接口,没有实现类,通过jaxws:client标签调用服务地址生成实现类
五、编写客户端代码(第二种方式)
这种方式不需要配置application-cxf.xml文件
在controller类中,添加如下代码:
URL wsdlURL = new URL("http://localhost:8080/App/services/demo?wsdl");
QName SERVICE_NAME = new QName("http://impl.webservice.web.comp.com/", "DemoWebserviceImplService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
DemoWebservice client = service.getPort(DemoWebservice.class);
String result = client.queryBaseTx();
System.out.println(result);
我建议使用第一种方式,第二种方式这个QName需要从服务端接口里去找,然后我想说的是,QName并不太好找,写错了代码执行会报错。
我这里把我生成的服务端wsdl的内容贴出来:
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.webservice.web.huarui.com/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://webservice.web.huarui.com/"
name="DemoWebserviceImplService" targetNamespace="http://impl.webservice.web.comp.com/">
<wsdl:import location="http://localhost:8080/App/services/demo?wsdl=DemoWebservice.wsdl" namespace="http://webservice.web.comp.com/"></wsdl:import>
<wsdl:binding name="DemoWebserviceImplServiceSoapBinding" type="ns1:DemoWebservice">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="queryBaseTx">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="queryBaseTx">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="queryBaseTxResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="queryBaseTxById">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="queryBaseTxById">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="queryBaseTxByIdResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="DemoWebserviceImplService">
<wsdl:port binding="tns:DemoWebserviceImplServiceSoapBinding" name="DemoWebserviceImplPort">
<soap:address location="http://localhost:8080/App/services/demo"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
注意看一下,这个QName里面的参数对应的是wsdl:definitions标签里面的targetNamespace属性和name属性
六、编写客户端代码(第三种方式)
使用cxf工具里面的wsdl2java生成客户端代码,我参考的这篇文章:http://blog.csdn.net/hu_shengyang/article/details/38384839
我这里不再介绍这种方法
我生成客户端代码的命令是:
wsdl2java -p com.comp.web.client -d d:\web\client -client http://localhost:8080/App/services/demo?wsdl
Spring和cxf3的整合,以maven的方式的更多相关文章
- 基于dubbo的SSM(Spring,SpringMvc,Mybatis)整合的Maven多工程(下)
上篇是SSM的maven单工程(http://www.cnblogs.com/yuanjava/p/6748956.html).中篇是 SSM的maven多工程(http://www.cnblogs. ...
- Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建)
最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...
- Spring 3整合Quartz 1实现定时任务一:常规整合(基于maven构建)
Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类 ...
- 基于maven进行spring 和mybatis的整合(Myeclpise)
学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
写在前面的话 承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
- MongoDB 学习(三)MongoDB 和 Spring 整合(Maven)
一.MongoDB 和 Spring 整合(Maven) 1.相关 jar 包准备 2.用 Maven 创建项目,pom.xml 文件 <project xmlns="http://m ...
- Spring与Quartz的整合实现定时任务调度
摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...
随机推荐
- 1531: [POI2005]Bank notes二进制优化(c++)
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- C复数的四则运算
#include<stdio.h> void judge(int True,int Fake) { if (True == 0) { if (Fake == ...
- nodejs: 理解Buffer
学习nodejs中buffer这一章,有一段写到buffer的拼接,其中一段源码非常优美,特拿来与大家共享. var chunks = []; var size = 0; res.on('data', ...
- 新机自动创建yum库
#!/bin/bash#for a newsystem to setup auto reposity YUM_DIR=/etc/yum.repos.dMOUNT_DIR=/mntDEV_DIR=&qu ...
- background-position的百分比
看到了几篇文章,总结下先: 1. background-position是依赖于no-repeat的,在repeat的状态下和默认的状态下(默认即为repeat),background-positio ...
- 黑马程序员_Java基础:多功能小窗口,swing,io,net综合应用
------- android培训.java培训.期待与您交流! ---------- 概念原理的理解,不代表能熟练应用. 如果将多个知识点关联并应用起来,这能加快我们对知识的掌握. 作为一个初学者, ...
- [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)
最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...
- Orleans 高级特性-目录
这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...
- ConcurrentDictionary 对决 Dictionary+Locking
在 .NET 4.0 之前,如果我们需要在多线程环境下使用 Dictionary 类,除了自己实现线程同步来保证线程安全之外,我们没有其他选择. 很多开发人员肯定都实现过类似的线程安全方案,可能是通过 ...
- PAAS平台构建7×24小时高可用应用的方案设计
本博客迁移到部署在jae上的独立博客系统wordpress,博客地址:点击打开独立博客.欢迎大家一起来讨论IT技术. 现在很多企业都在搭建自己的私有PAAS平台,当然也有很多大型互联网公司搭建共有PA ...