1. 运行环境
(1) 操作系统:window10
(2) JDK:1.7
(3) IDE:Myeclipse10
(4)服务器:tomcat7
2. cxf 服务端搭建步骤
(1) 配置maven配置文件pom.xml, 加载cxf所需jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dh</groupId>
<artifactId>TestWebService</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>TestWebService</name>
<url>http://maven.apache.org</url>
<properties>
<junit-version>3.8.1</junit-version>
<spring.version>4.3.9.RELEASE</spring.version>
<cxf.version>3.1.8</cxf.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--web service 以下都是cxf必备的-->
<!--org.apache.cxf.transport.servlet.CXFServlet-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<!--
不加这个包会报错Unable to locate spring NamespaceHandler for XML schema namespace
[http://cxf.apache.org/jaxws]-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<!--java实现webservice,不部署到tomcat,需要jetty包支持-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
</dependency>
</dependencies>
<build>
<finalName>TestWebService</finalName>
</build>
</project>
(2) 编写集成spring的配置文件springmvc.xml及cxf的配置文件spring-webservice.xml
A. springmvc.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!-- 1. 使用默认的注解映射,开启springmvc注解模式 -->
<mvc:annotation-driven />
<!--
2. 静态资源默认的servlet配置,
(1)允许对静态资源的处理:js,gif
(2)允许使用“/”做整体映射-->
<!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL-->
<mvc:default-servlet-handler/>
<!-- 3. 配置自动扫描的包@Controller -->
<context:component-scan base-package="com.test.testservice"></context:component-scan>
<!-- 4. 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 5. 定义无需Controller的url<->view直接映射 -->
<mvc:view-controller path="/" view-name="redirect:/index"/>
</beans>
B. spring-webservice.xml
<?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://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true">
<!-- 引入CXF Bean定义如下,早期的版本中使用 -->
<!--<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--> <!-- WebService的实现Bean定义 -->
<!--web.xml配置了webservice的访问路径/server/*,那么/server/web-publish?wsdl就是该webservice的访问路径-->
<bean id="webserviceServer" class="com.test.testservice.cxf.webservice.impl.MyWebServiceImpl"/>
<!-- jax-ws endpoint定义 -->
<jaxws:endpoint id="myService" implementor="#webserviceServer" address="web-publish">
</jaxws:endpoint> <!--发布webservice-->
</beans>
(3) 定义接口IMyWebService 及实现类MyWebServiceImpl
A. IMyWebService.java
package com.test.testservice.cxf.webservice.impl;
import javax.jws.WebService;
import com.test.testservice.cxf.webservice.IMyWebService;
@WebService(endpointInterface="com.test.testservice.cxf.webservice.IMyWebService")
public class MyWebServiceImpl implements IMyWebService {
@Override
public int add(int a, int b) {
System.out.println("----a+b=====" + (a+b));
return 0;
}
@Override
public int minus(int a, int b) {
System.out.println("----a-b=====" + (a-b));
return 0;
}
}
B. MyWebServiceImpl.java
package com.test.testservice.cxf.webservice.impl;
import javax.jws.WebService;
import com.test.testservice.cxf.webservice.IMyWebService;
@WebService(endpointInterface="com.test.testservice.cxf.webservice.IMyWebService")
public class MyWebServiceImpl implements IMyWebService {
@Override
public int add(int a, int b) {
System.out.println("----a+b=====" + (a+b));
return 0;
}
@Override
public int minus(int a, int b) {
System.out.println("----a-b=====" + (a-b));
return 0;
}
}
(4) 发布应用到tomcat,在浏览器中访问:http://localhost:8080/TestWebService/server/web-publish?wsdl ,即可查看接口信息
3.cxf 客户端调用(与cxf 服务端在同一应用中)
package com.test.testservice.cxf.webservice;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class ClientForCXF {
public static IMyWebService getInterFace() {
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setServiceClass(IMyWebService.class);
factoryBean.setAddress("http://localhost:8080/TestWebService/server/web-publish");
return (IMyWebService) factoryBean.create();
}
public static void main(String[] args) {
IMyWebService myWebService = getInterFace();
System.out.println("client: " + myWebService.add(1, 3));
}
}