转载请出自出处:http://eksliang.iteye.com/blog/2265685
一、概述
在《CXF学习笔记一》中使用代理工厂JaxWsProxyFactoryBean来发布WebService,但是这种发布有个缺陷,那就是必须运行在指定端口上面,如果端口被占用,就会报错,假如现在的需求是:我有个WEB应用想部署在tomcat里面,而我这个WEB应用发布的WebService我也想使用8080端口,怎么办?
答:使用CXF自带的CXFServlet就可以完成这个功能。
二、配置CXFServlet
既然是CXFServlet那就必须在web.xml中配置这个Servlet,代码如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<!-- Cxf中使用 CXFServlet,发布跟当前项目端口相同的服务 -->
<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>/cxf/*</url-pattern>
</servlet-mapping>
默认情况下,CXFServlet会去加载WEB-INF下创建cxf-servlet.xml配置文件,但是我这里配置了contextConfigLocation,所以在类路径下面加载的CXF配置也同样生效。
三、服务接口以及实现类如下所示
接口:
import java.util.List;
import javax.jws.WebService;
import com.gosun.jws.daomain.Users;
/**
* @author Ickes
*/
@WebService
public interface UserService {
/**
* 测试返回list
* @return
*/
public List<Users> geAlltUsers();
/**
* 测试返回实体,以及传人普通参数
* @param id
* @return
*/
public Users getUser(String id);
/***
* 测试传入对象
* @param user
*/
public void save(Users user);
/**
* 测试传人集合
* @param users
*/
public void saves(List<Users> users);
}
实现类:
import java.util.List;
import javax.jws.WebService;
import com.gosun.jws.daomain.Users;
import com.gosun.jws.daomain.UsersFactory;
@WebService(serviceName = "cxfService",
endpointInterface = "com.gosun.jws.cxf.UserService"
)
public class UserServiceImpl implements UserService {
@Override
public List<Users> geAlltUsers() {
return UsersFactory.getUsers();
}
@Override
public Users getUser(String id) {
System.out.println(id);
return UsersFactory.getUser();
}
@Override
public void save(Users user) {
System.out.println(user.toJson());
}
@Override
public void saves(List<Users> users) {
for (Users u : users) {
System.out.println(u.toJson());
}
}
}
测试用到的:UsersFactory工具类和Users实体类在:http://eksliang.iteye.com/blog/2265021篇文章的3.1和3.2代码中
四、配置CXF的配置文件
在classpath目录下面新建applicationContext-cxf.xml文件,内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:soap="http://cxf.apache.org/bindings/soap"
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">
<!-- CXFServlet 会自动把com.gosun.jws.cxf.UserServiceImpl发布为WebService -->
<jaxws:server id="cxfUserService" serviceClass="com.gosun.jws.cxf.UserService"
address="/userService">
<jaxws:serviceBean>
<bean class="com.gosun.jws.cxf.UserServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
</beans>
五、测试
我使用8080端口进行发布我的WEB服务,在浏览器中输入http://localhost:8080/jws/cxf,返回结果如下发布成功。