代码改变世界

WebService 开发入门 基于CXF框架

2012-08-30 07:51  chen.simon  阅读(1650)  评论(0编辑  收藏  举报

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之间转换的工具