一、CXF的介绍
Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。
二、CXF的准备条件
所需要的jar包:
xmlbeans-2.4.0.jar
wss4j-1.5.9.jar
jetty-server-7.1.6.v20100715.jar
jetty-util-7.1.6.v20100715.jar
geronimo-ws-metadata_2.0_spec-1.1.3.jar
geronimo-activation_1.1_spec-1.1.jar
geronimo-servlet_3.0_spec-1.0.jar
velocity-1.6.4.jar
jaxb-xjc-2.2.1.1.jar
xml-resolver-1.2.jar
wsdl4j-1.6.2.jar
cxf-2.3.0.jar
XmlSchema-1.4.7.jar
jaxb-api-2.2.1.jar
jaxb-impl-2.2.1.1.jar
neethi-2.0.4.jar
geronimo-annotation_1.0_spec-1.1.1.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
下载地址:http://download.csdn.net/detail/ch656409110/5748183 (取自己需要的jar包)
三、创建webservice服务端
第一:导包加入maven依赖:
由于我的是maven项目就直接在pom.xml文件中添加下面依赖就可以了
<!--cxf-->
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>
第二: 在web.xml中配置CXF框架的核心servlet
之后只要我们访问webservice/*这个地址就会进入CXF的servlet中。(对应以下链接的红色标记部分)
<!--定义一个cxf的servlet-->
<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>/webservice/*</url-pattern>
</servlet-mapping>
http://127.0.0.1:8080/ssm/
webservice
/HelloWorld?wsdl
第三: 整合Sring配置
接下来是最重要的一部,用Spring整合CXF:在这之前我有新建一个CXF的包,如下图:
这里有两个主要类
- HelloWorld接口。
- 实现HelloWorld接口的HelloWorldImpl类。
代码如下:
HelloWorld.java
package cn.temptation.cxf;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(name="HelloWorld",targetNamespace="http://cxf.temptation.cn/")
public interface HelloWorld {
public String say(@WebParam(name="str") String str);
}
注: targetNamespace 与接口中的命名空间一直,一般是接口报名的倒置
其中就只定义了一个简单的say()
方法。
============================================================================================
HelloWorldImpl.java
package cn.temptation.cxf;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
@Component("helloWorld")
@WebService(endpointInterface="cn.temptation.cxf.HelloWorld",serviceName="HelloWorld",targetNamespace="http://cxf.temptation.cn/")
public class HelloWorldImpl implements HelloWorld {
@Override
public String say(String str) {
return "Hello"+str;
}
}
这里就是对say()
方法的简单实现。
注:
endpointInterface 接口地址的全路径
serviceName 接口名称
=======================================================================
定义CXF的Spring的配置文件:
spring-cxf.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.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-extension-soap.xml" />
<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
<!-- 自动扫描webService -->
<context:component-scan base-package="cn.temptation.cxf" />
<jaxws:endpoint implementor="cn.temptation.cxf.HelloWorldImpl" address="/HelloWorld"/>
</beans>
其中:
- 以下三个为CXF相关的核心配置文件(CXF自带的不用管,直接导入就可以了)
<import resource="classpath*:META-INF/cxf/cxf.xml" />
<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
2. 启用 自动扫描webService(一定要把包路径写正确)
<context:component-scan base-package="cn.temptation.cxf" />
3.对于以下代码
<jaxws:endpoint implementor="cn.temptation.cxf.HelloWorldImpl" address="/HelloWorld"/>
implementor :接口实现类的全路径
address:项目发布后的访问地址(对应以下红色标记)
http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl
=======================================================================
在web.xml的文件中引入CXF的配置文件:(红色标记部分)
<!-- 配置Spring环境 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml,classpath:applicationContext-redis.xml,classpath:spring-cxf.xml</param-value>
</context-param>
之后我们运行项目输入该地址: http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl如果出现如下界面(说明我们的服务端配置已经完成):
三、创建webservice客户端
我们可以任意创建一Java项目或者web项目导入开头所说的相关jar包,然后创建测试类
Test.java
package ssm;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class Test {
public static void main(String[] args) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl");
Object[] objects=client.invoke("say","yyyyyyy");
//调用web Service//输出调用结果
System.out.println(objects[0].toString());
}
}
运行main()方法看看是否可以得到对应的结果:
测试方法:
实现类方法如下:
运行结果: