本篇文章主要介绍一下cxf框架,以及与spring框架整合后webservice的发布,这需要提前对webservice有一个初步的了解。
1、cxf框架的介绍
Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。
下面就开始使用cxf框架来发布一个web服务。
1.1 ServerFactoryBean来发布web服务:
服务类的代码如下:
@WebService(name="Hello",targetNamespace="http://icast.cn")
public class HelloWorld {
public String sayHi(String name) {
return "hello---->" + name;
}
}
发布类代码如下:
public static void main(String[] args) {
// 发布服务的类, 类似Endpoint
ServerFactoryBean serverFactoryBean=new ServerFactoryBean();
// 注册服务器地址和端口
serverFactoryBean.setAddress("http://127.0.0.1:9999/hello");
// 注册哪个类提供服务
serverFactoryBean.setServiceBean(new HelloWorld());
// 发布一个cxf服务
serverFactoryBean.create();
}
以上就通过ServerFactoryBean简单的发布了一个web服务,这里需要注意的是:这种方式没有添加webService注解,也就是说没有注解也可以发布webService服务,但是这种方式不是很规范,比如我们不可以通过注解的方式来修改WSDL的标签信息。说白了就一点,如果通过ServerFactoryBean来发布服务的话,不能添加注解(添加的注解无效)。
1.2 通过JaxWsServerFactoryBean来发布web服务
1. JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
2. 此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范
3. 更重要的是可以通过添加拦截器拦截请求
服务端代码如下:
@WebService
public class HelloWorld {
public String sayHi(String name) {
return "hello---->" + name;
}
}
发布类代码如下:
public static void main(String[] args)throws Exception {
// 发布服务的类, 类似Endpoint
JaxWsServerFactoryBean jaxWsServer=new JaxWsServerFactoryBean();
// 注册服务器地址和端口
jaxWsServer.setAddress("http://127.0.0.1:9999/hello");
// 注册哪个类提供服务
//注意:这里还要设置setServiceClass这个属性,否则wsdl文件生成会有问题
jaxWsServer.setServiceBean(HelloWorld.class);
jaxWsServer.setServiceBean(new HelloWorld());
// 配置输入输出日志拦截器
jaxWsServer.getInInterceptors().add(new LoggingInInterceptor());
jaxWsServer.getOutInterceptors().add(new LoggingOutInterceptor());
// 发布一个cxf服务
jaxWsServer.create();
}
通过java客户端调用服务类:
public static void main(String[] args) {
HelloWorldService helloWorldService=new HelloWorldService();
HelloWorld helloWorld=helloWorldService.getHelloWorldPort();
System.out.println(helloWorld.sayHi("test"));
}
2. CXF与Spring集成发布WebService
现在我们需要在tomcat启动的时候,我们发布的服务随之启动,这就需要借助spring框架来管理,其实cxf里面已经集成了spring框架,我们只需要把cxf中lib下的包都导进来即可,其中jetty服务器的包可以不要,因为我们要部署到tomcat的服务器上面。
在web.xml文件中配置cxf的核心servlet,以及添加spring配置文件和监听
<!-- 添加cxf的servlet处理webservice请求 -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<!-- 添加spring监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
在spring中管理cxf核心bean并发布服务:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 这样配置自身的服务也可以使用 -->
<bean id="userImpl" class="cn.itcast.i.cxf.spring.ws.UserImpl" />
<!-- id:逻辑名 serviceClass=服务接口类 address:调用的路径 http://localhost:8888/项目名/ws/hello?wsdl> -->
<jaxws:server id="userService" serviceClass="cn.itcast.i.cxf.spring.ws.IUser" address="/hello">
<jaxws:serviceBean>
<ref bean="userImpl" />
</jaxws:serviceBean>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxws:outInterceptors>
</jaxws:server>
</beans>
其中需要注意的是jaxws的命名空间以及 地址:
命名空间:xmlns:jaxws="http://cxf.apache.org/jaxws"
地址:
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
服务接口如下:
@WebService
public interface IUser {
public void saveUser(User user);
public User getUser(int uid);
}
服务类如下:
public class UserImpl implements IUser {
private List<User> users=new ArrayList<User>();
public User getUser(int uid) {
for(User temp:users){
if(temp.getUid()==uid){
return temp;
}
}
return null;
}
public void saveUser(User user) {
// TODO Auto-generated method stub
users.add(user);
}
}
这样就简单完成了cxf和spring整合的ws发布,不足之处望多多指正。