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