Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于spring的轻量级容器中,也可以部署在更高级的服务器上,例如Jboss、WebSphere或WebLogic。下面将创建一个简单的webservice例子,并集成spring将其发布到tomcat上。
参考:http://cxf.apache.org/docs/a-simple-jax-ws-service.html
http://cxf.apache.org/docs/writing-a-service-with-spring.html
http://blog.csdn.net/accountwcx/article/details/47082487
操作系统:win10
Java版本:JDK1.8
IDE工具:eclipse-neon.3
项目管理:Maven3.5
服务器:tomcat7
Maven依赖:
......
<dependencies>
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-frontend-jaxwsartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-transports-httpartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-transports-http-jettyartifactId>
<version>3.0.0version>
dependency>
dependencies>
......
构建一个简单的webservice示例只需四步:
1.编写服务接口
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
//使用@WebParam可以使得自动生成客户端代码时,变量名称不变,
//若不使用则自动生成的客户端代码中变量名为arg0
String sayHi(@WebParam(name="text")String text);
}
2.编写接口实现类
import javax.jws.WebService;
import cn.hl.ws.server.HelloWorld;
@WebService(endpointInterface="cn.hl.ws.server.HelloWorld",
serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String text) {
return "Hello "+text;
}
}
3.发布服务,这里有两种方法
import javax.xml.ws.Endpoint;
import cn.hl.ws.server.impl.HelloWorldImpl;
public class HelloWorldApp {
//发布方法一:
public static void main(String[] args) {
System.out.println("starting server...");
HelloWorldImpl hw = new HelloWorldImpl();
//服务发布的地址
String address = "http://localhost:8080/helloWorld";
Endpoint.publish(address, hw);
System.out.println("server started");
}
}
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import cn.hl.ws.server.impl.HelloWorldImpl;
public class HelloWorldApp2 {
//发布方法二:
public static void main(String[] args) {
System.out.println("starting server...");
JaxWsServerFactoryBean fb = new JaxWsServerFactoryBean();
HelloWorldImpl hw = new HelloWorldImpl();
fb.setServiceClass(HelloWorld.class);
//服务发布地址
fb.setAddress("http://localhost:8080/helloWorld");
fb.setServiceBean(hw);
fb.create();
System.out.println("server started");
}
}
编写完成后run as java application,若未报错且访问 http://localhost:8080/helloWorld?wsl 能看见xml文档则说明服务发布成功。
4.编写客户端访问服务
首先通过工具自动生成客户端java代码,jdk提供了wsimport,cxf提供了wsdl2java,用法如下:
wsimport -encoding 编码 -s 源码存放目录 -d class文件存放目录 -p 包名 服务地址
wsdl2java -d class文件存放目录 -p 包名 服务地址
//我的是这么写的
wsimport -encoding utf-8 -s E:\wsdl -p cn.ws.client http://localhost:8080/helloWorld?wsdl
将生成的客户端代码拷贝到客户端项目,注意客户端也应添加开始所写的maven依赖
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import cn.hl.ws.server.HelloWorld;
public class HelloClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean fb = new JaxWsProxyFactoryBean();
fb.setServiceClass(HelloWorld.class);
fb.setAddress("http://localhost:8080/helloWorld");
HelloWorld hw = (HelloWorld) fb.create();
String response = hw.sayHi("World!");
System.out.println(response);
}
}
,保持服务发布程序运行,然后运行客户端访问服务,可见控制台输出Hello World!
,服务调用成功。
1.用maven新建一个web项目,目录结构应符合maven标准。
如图所示
/src/main/java 存放源码
/src/main/resources 存放配置资源文件
/src/main/webapp web项目根目录
/target/classes 编译文件输出目录
然后修改编译输出目录为WEB-INF/classes,修改部署设置
pom.xml添加cxf、spring依赖
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-frontend-jaxwsartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-transports-httpartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-rt-transports-http-jettyartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.3.8.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>4.3.8.RELEASEversion>
dependency>
2.编写web项目其他配置
web.xml
......
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>/WEB-INF/config/cxf-servlet.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>CXFServletservlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>CXFServletservlet-name>
<url-pattern>/service/*url-pattern>
servlet-mapping>
<welcome-file-list>
<welcome-file>index.htmlwelcome-file>
welcome-file-list>
web-app>
index.html随便写句话测试就行
<body>
align="center">this is a webservice demo
body>
3.然后是服务的编写,与上面例子相同:
(1)编写服务接口类、接口实现类(同上)
(2)spring配置文件cxf-servlet.xml
<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"/>
<bean id="helloWorld" class="cn.hl.ws.server.impl.HelloWorldImpl"/>
<jaxws:endpoint id="hello"
implementor="#helloWorld"
address="/helloworld"/>
beans>
此时web项目已构建完毕,服务也可以发布了,run on server 选择tomcat7,成功启动tomcat后访问首页:
http://localhost:8080/webservicedemo1/
能看到我们编写的index.html则项目正常运行,然后访问wsdl地址:
http://localhost:8080/webservicedemo1/service/helloworld?wsdl
能看到xml文档则说明服务发布成功,然后便可以编写客户端访问服务了,此处不再重复赘述。
注:可能出现的问题
1.右键项目没有run on server 选项,请确认你的项目已转化为Dynamic Web Module,具体为
打开项目属性>Project Facets>Dynamic Web Module前面打勾>Further configuration available>将content改为/src/main/webapp。
2.项目各部分版本一定要兼容,如tomcat7支持的Dynamic Web Module为2.2-3.0。
3.项目jdk与tomcat运行环境jdk保持一致。