分分钟带你玩转 Web Services【2】CXF

简介:

   在实践中一直在使用 JAX-WS 构建 WebService 服务,服务还是非常稳定、高效的。

   但还是比较好奇其他的 WebService 开源框架,比如:CXF/Axis2/Spring WS等。

   源于对 Apache 的信赖和喜爱, 旗下的 CXF  WebService 肯定也不会让人失望。

   所以花了点时间将 CXF 引入到项目实践当中,多一种选择也未尝不可。

   对于 WebService 和 CXF 简介这里就不赘述了,不太懂的同学请先移步:分分钟带你玩转 Web Services【1】JAX-WS

   本篇试从 Servlet 发布 CXF WebService 和  Spring 托管 CXF WebService 两种方式,带你玩转 CXF。

   Servlet 发布 CXF WebService git demo地址:http://git.oschina.net/LanboEx/cxf-demo

   Spring 托管 CXF WebService git demo地址: http://git.oschina.net/LanboEx/cxf-spring-demo

   需要有这方面实践的同学,请收藏这篇博客,到时只需将 Demo 在本地跑起来,一切就都明朗了。

   官网地址(如果你对你英文很自信的话):http://cxf.apache.org/docs/index.html

1. Servlet 发布 CXF WebService 

a.mavn 依赖 Jar:

复制代码
       <!--web 容器支持-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <!--apache cxf webservice-->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.11</version>
        </dependency>
复制代码

   依赖的 Jar 基本上都是 sum/apache/codehaus 支持,这些 Jar 已经过岁月洗涤,稳定高效。

b.服务实现:

复制代码
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface UserService {

    /**
     * 执行测试的WebService方法(有参)
     */
    @WebMethod
    String sayHi(@WebParam(name = "name") String name);
}
复制代码
复制代码
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class UserServiceImpl implements UserService {

    @WebMethod
    public String sayHi(String name) {
        return "Hi, " + name + "! ";
    }
}
复制代码

c.Servlet 实现:

复制代码
public class WebServicesServlet extends CXFNonSpringServlet {
    private static final long serialVersionUID = -5314312869027558456L;

    @Override
    protected void loadBus(ServletConfig servletConfig) {
        super.loadBus(servletConfig);
        Endpoint.publish("/UserService", new UserServiceImpl());
    }
}
复制代码

   你没有看错 CXF 提供的不集成 Spring 的 Servlet 就叫做 CXFNonSpringServlet,是不是有点俗。

   使用起来也很简单,实现 org.apache.cxf.transport.servlet.CXFNonSpringServlet 中的 loadBus 方法即可。

d.web.xml 配置:

复制代码
    <servlet>
        <servlet-name>cxfwsServlet</servlet-name>
        <servlet-class>com.rambo.cxf.demo.ws.servlet.WebServicesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxfwsServlet</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
复制代码

   启动工程,访问:http://localhost:4042/cxf-demo/ws/UserService?wsdl

   Servlet 发布 CXF WebService 方式在后续推广使用中发现,部署 weblogic 时会出现错误:

   java.lang.IllegalArgumentException: Cannot create URL for this address /XXXXXX

   而该错误需要降低 CXF 版本才能顺利解决,这已经违背了我们项目开发的原则。

   参考地址:http://git.net/ml/users-cxf-apache/2014-07/msg00027.html

2. Spring 托管 CXF WebService

a.mavn 依赖 Jar:

复制代码
        <!--spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!--apache cxf webservice-->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.11</version>
        </dependency>
复制代码

   只需要依赖 SpringWeb 即可,其中 Spring Context 来托管 WebService 服务的实现类。

   服务实现和 web.xml 与 Servlet 发布 是一致的,不需要进行特殊的处理,这里就不贴了。

b. 将 WebService 服务托管给 Spring Context 

复制代码
<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">

    <bean id="userService" class="com.rambo.cxf.spring.demo.impl.UserServiceImpl"/>

    <jaxws:endpoint id="userServiceWs" implementor="#userService" address="/UserService"/>
</beans>
复制代码

   启动工程,访问:http://localhost:4047/cxf-spring-demo/ws/UserService?wsdl

3. 小结

   Servlet 发布 CXF WebService 依赖的开源库较少,也就是说出问题的概率较小;

   每次新增 WebService 服务需要修改 WebServicesServlet 类。

   Spring Context 托管 WebService 实现类,新增服务类可配置在 cxf-servlet.xml 中;

   有优秀的容器替你管理,你会很舒服,大型复杂 WebService 建议配合 Spring 使用。

4. CXF 客户端

   当然客户端的使用也有两种方式:

   a. 使用工具或者命令行,根据 wsdl 文档生成调用代码,进行调用访问(在上篇中描述过);

   b. 配合 spring 进行配置,无需生成客户端代码,交由 spring  统一管理;

复制代码
  <!-- 方式一:基于spring的jaxws -->
    <jaxws:client id="UserService"
                  serviceClass="com.rambo.cxf.spring.demo.ws.inter.UserService"
                  address="http://localhost:4047/cxf-spring-demo/ws/UserService">
    </jaxws:client>

    <!-- 方式二:基于cxf的JaxWsProxyFactoryBean -->
    <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="com.rambo.cxf.spring.demo.inter.UserService"/>
        <property name="address" value="http://localhost:4047/cxf-spring-demo/ws/UserService"/>
    </bean>
复制代码

   a 方式被调用方项目不需要添加任何依赖,即可使用客户端代码进行调用访问。

   但当服务中涉及交互的安全控制时,还是需要将所依赖添加至项目中,所依赖的 jar 相当庞大。

   涉及安全认证时使用 spring 方式配置是最妥当的,引入服务的接口层和相关的依赖即可。

本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/6752128.html,如需转载请自行联系原作者

相关文章
|
7月前
|
前端开发 JavaScript API
阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
【1月更文挑战第15天】【1月更文挑战第72篇】阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
180 6
|
XML Java 数据格式
大多数人忽略了的Spring官方项目,Spring Web Services
大多数人忽略了的Spring官方项目,Spring Web Services
1326 0
|
2月前
|
XML 关系型数据库 MySQL
Web Services 服务 是不是过时了?创建 Web Services 服务实例
本文讨论了WebServices(基于SOAP协议)与WebAPI(基于RESTful)在开发中的应用,回顾了WebServices的历史特点,比较了两者在技术栈、轻量化和适用场景的差异,并分享了使用VB.net开发WebServices的具体配置步骤和疑问。
28 0
|
6月前
|
XML 前端开发 JavaScript
RESTful Web Services
RESTful Web Services
47 2
|
7月前
|
Ubuntu Linux 网络安全
在Amazon Web Services中使用R语言运行模拟
在Amazon Web Services中使用R语言运行模拟
|
弹性计算 安全 数据安全/隐私保护
Internet Information Services(IIS)部署Web项目
本文为您介绍如何快速使用IIS搭建简单网站并发布项目。
|
Java Linux API
Java:ews-java-api获取Exchange Web Services (EWS)会议日程
Java:ews-java-api获取Exchange Web Services (EWS)会议日程
694 0
|
XML 网络协议 JavaScript
Web Services:重整山河待后生
Web Services:重整山河待后生
177 0
Web Services:重整山河待后生
|
弹性计算 安全 Windows
Internet Information Services(IIS)部署Web项目
Window Server2016服务器,mstsc远程桌面连接,IIS安装与配置
836 0
Internet Information Services(IIS)部署Web项目
|
Apache Java 应用服务中间件
HanLP封装为web services服务的过程介绍
前几天的召开的2019年大数据生态产业大会不知道大家关注到没有,看到消息是hanlp2.0版本发布了。不知道hanlp2.0版本又将带来哪些新的变化?准备近期看能够拿到一些hanlp2.0的资料,如果能顺利拿到的话,到时候分享给大家!今天分享这篇是关于将hanlp封装到web services服务中的。
4685 0