zoukankan      html  css  js  c++  java
  • WebService 开发入门 基于CXF框架

    WebService 开发入门 基于CXF框架

    http://simonme.org/?p=58

    本文阐述哪些点:

    1. WSDL相关知识。

    a. 包括Service,port,bind, portType, operation.

    b. Eclipse中用WSDL编辑器编辑WSDL文件

    c. 用xsd文件重用Type定义

    2. 基于CXF搭建一个Demo,含服务端,客户端。

    3. WSDL样式

    4. JAX-WS 和JAX-RS

    从我所接触的开发路线是,拿到一个WSDL开始干活。所以从WSDL写起。

    当然你要是自己打算搭建一套web服务,也可以先设计WSDL,也可以先写Java代码。

    业界都有现成的工具,用于WSDL和Java代码之间相互转换。像CXF还提供了包括IDL在内的更多形式的转换。

    1. WSDL相关知识

    可以参见http://www.w3school.com.cn/wsdl/index.asp

    这个详细的讲述了Service,port,bind, portType, operation

    并且的它的比喻很贴切

    用Eclipse编辑出来的WSDl大概就是如下图这样:

    上面addUser这个入参和出参都是在外部的xsd文件中的定义的。当然也可以直接定义在这个wsdl中

    但是为了重用,建议还是分离出来。

    分离出来后的xsd,需要在wsdl文件中引用他

    代码类似

        <wsdl:types>
        	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.simonme.org/cxfDemo/">
        		<xsd:import namespace="http://www.simonme.org/cxfDemo/" schemaLocation="cxfDemo.xsd" />
        	</xsd:schema>
        	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        		<xsd:import namespace="http://www.simonme.org/cxfDemo/"
        			schemaLocation="cxfDemo.xsd">
        		</xsd:import></xsd:schema></wsdl:types>

    xsd 类似

    2. 基于CXF搭建一个Demo,含服务端,客户端

    a.

    demo的代码在 google code  http://demo-xiaguang.googlecode.com/svn/trunk/cxf_demo

    这个demo 是用嵌入式Jetty当服务器

    UserInfoMgr_SysMgr_Server 跑起来就是服务端

    UserInfoMgr_SysMgr_Client跑起来就是客户端测试代码

    b.

    细心的同学 可能会发现有两个server和client

    这是基于两个wsdl做的两套测试demo。

    这两个wsdl不同就在于其bind方式不一样

    一个是http的

    一个是SOAP的 且是 RPC/Literal的  具体的这个点3有个文章讲

    需要jar lib为

    c.

    对于服务实现类

    UserInfoMgrImpl 有点要求就是

    不能直接return null

        public org.simonme.cxf.rpc.literal.AddUserRespInfo addUser(AddUserReqInfo addUserReq) {
            LOG.info("Executing operation addUser");
            System.out.println(addUserReq);
            try {
                org.simonme.cxf.rpc.literal.AddUserRespInfo _return = null;
    
                /**
     * 此处若不做处理 直接return null
     * 结果集中的子元素为null也不行
     * cxf框架应该会对这个结果做转换
     * 在以RPC/literal方式绑定时会出问题
     * 大概的异常是
     * Cannot write part addUserResp. RPC/Literal parts cannot be null. (WS-I BP R2211)
     * start
     */
                _return = new AddUserRespInfo();
                ReturnResult result = new ReturnResult();
                result.setReturnCode(0);
                result.setReturnMessage("test add user ok.");
                _return.setResult(result);
                // end
    
                return _return;
            } catch (java.lang.Exception ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex);
            }
        }

    d.

    且生成的服务类注解要略作修改

    如下

    @javax.jws.WebService(
    
                          serviceName = "CxfDemo",
    
                          portName = "SysMgr",
    
                          endpointInterface = "org.simonme.cxf.rpc.literal.UserInfoMgr")
    
    public class UserInfoMgrImpl implements UserInfoMgr {...

    e.

    生成代码的大概命令是

    ./wsdl2java -p org.simonme.cxf.demo -d /Users/mac/800.temp/gen_wsdl/cxfdemo -all /Users/mac/100.workspace/android_ws/cxf_demo/src/cxfDemo.wsdl

    3. WSDL样式

    这个主要是指bind的样式

    推荐阅读:http://www.ibm.com/developerworks/cn/webservices/ws-whichwsdl/

    4. JAX-WS 和JAX-RS

    支持 SOAP 的是 JAX-WS,即 JSR 224,http://jcp.org/en/jsr/detail?id=224
    支持 REST 的是 JAX-RS,即 JSR 311,http://jcp.org/en/jsr/detail?id=311
    jaxb是java xml binding,是jax-rs jax-ws底层使用的对象与xml之间转换的工具

  • 相关阅读:
    C++重载运算符
    C++中的友元函数和友元类
    C++中的static关键字
    C++的new运算符和delete运算符
    git常用命令
    php+mysql+apache报错
    Nodejs 异步式 I/O 与事件式编程
    开始用Node.js编程
    Nodejs 模块
    Mac OS X上安装Node.js
  • 原文地址:https://www.cnblogs.com/simoncook/p/2663025.html
Copyright © 2011-2022 走看看