CXF+Spring发布webservice

本篇文章主要介绍一下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发布,不足之处望多多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值