一、引入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的方式的更多相关文章

  1. 基于dubbo的SSM(Spring,SpringMvc,Mybatis)整合的Maven多工程(下)

    上篇是SSM的maven单工程(http://www.cnblogs.com/yuanjava/p/6748956.html).中篇是 SSM的maven多工程(http://www.cnblogs. ...

  2. Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建)

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  3. Spring 3整合Quartz 1实现定时任务一:常规整合(基于maven构建)

    Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类 ...

  4. 基于maven进行spring 和mybatis的整合(Myeclpise)

    学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...

  5. Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM

    写在前面的话   承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...

  6. mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

    文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...

  7. mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

    继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...

  8. MongoDB 学习(三)MongoDB 和 Spring 整合(Maven)

    一.MongoDB 和 Spring 整合(Maven) 1.相关 jar 包准备 2.用 Maven 创建项目,pom.xml 文件 <project xmlns="http://m ...

  9. Spring与Quartz的整合实现定时任务调度

    摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...

随机推荐

  1. ViewPager 仿 Gallery效果

    xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android ...

  2. android studio view.setId报错

    自定义控件设置id的时候会报错,如:view.setId(100); 解决方法: 方案一:通过调用View.generateViewId()作为setId的参数,但此方案不是最佳方案,因为View.g ...

  3. Java截图笔记

  4. struts2 jsp 传参 NullPointerException问题解决

    今天遇到了一个问题,那就是jsp给struts2传递参数的时候,总是空指针异常,开始我以为是可能是哪里写的不对,但是经过仔细检查后,没有发现什么异常的地方,后来我发现我的po类里面没有空构造,只有一个 ...

  5. hdu 5682 zxa and leaf

    zxa and leaf  Accepts: 25  Submissions: 249  Time Limit: 5000/2500 MS (Java/Others)  Memory Limit: 6 ...

  6. 数据库知识整理<七>

    组合查询: 7.1使用子查询: 嵌套在其他查询中的查询,我们称之为子查询.子查询本身也可能包含一个子查询.子查询也称为内部查询,而包含子查询的语句也称为外部查询. 所有的子查询可以被分为两个类别:子查 ...

  7. Oracle Ebs R12 SLA与GL关系变化

    http://www.cnblogs.com/bruce_zhao/p/3809886.html Oracle Ebs R12 SLA与GL关系变化 SLA概念:SLA(Subledger Accou ...

  8. pm2使用介绍

    https://segmentfault.com/a/1190000002539204

  9. java编程规范

    一.规范存在的意义 应用编码规范对于软件本身和软件开发人员而言尤为重要,有以下几个原因: 1.好的编码规范可以尽可能的减少一个软件的维护成本 , 并且几乎没有任何一个软件,在其整个生命周期中,均由最初 ...

  10. Windows2003 SQL2005解决系统Administrator密码不知道的问题

    Windows2003 SQL2005解决系统Administrator密码不知道的问题 今天上班的时候,有个同事说不知道谁设置了开机密码,那台电脑一直没有开机密码的他现在进不了桌面 那台电脑没有光驱 ...