Spring DM中整合CXF-DOSGi
最近有需要用到OSGi+REST+JSON的架构组合,做了一些技术验证。这里将总结的一些经验记录下来。
OSGi框架选型:
使用了Spring-DM,主要用它的服务发布功能
一、RESTful框架选型
CXF、RestLet、RestEasy、Jersey。4个REST框架都是JAX-RS(JSR311)的实现,验证期间对它们做了一个比较
|
CXF |
RestLet |
RestEasy |
Jersey |
License |
ASL2.0 |
LGPL |
ASL2.0 |
GPL+CDDL |
对OSGi支持 |
Good |
Ok |
No |
No |
对Spring支持 |
Ok |
Ok |
Ok |
Ok |
优点 |
轻量级框架对业务入侵小 |
部署包灵活 |
|
|
缺点 |
独立bundle有9M多 自带provider对JSON数据封结构复杂 |
REST标识必须写到实现类上 |
|
License限制太多 |
综合考虑CXF-DOSGi满足我们的需求:License友好、支持Spring-OSGi部署服务便利、入侵性小;
二、框架搭建
由于CXF-DOSGi自带的JSON数据绑定接口有着这样那样的问题,所以需要借助其他的数据绑定接口。Jackson是一个不错的选择。(为什么不是支持非OSGi版本CXF的jettison,是因为jettison没有Java对象和JSON数据相互转化的接口,使用起来没有Jackson便利)。
在Spring-DM中集成DOSGi非常简单,只要在Spring-DM的加载plan文件中加上DOSGi和Jackson的3个bundle(core、mapper、jaxrs),整个框架就支持RESTful了。
三、发布RESTful服务
1.定义服务接口。RESTful服务接口的定义和其他服务接口定义没有太大的区别,只是在接口类加上RESTful的声明
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @Path("greeter") public interface GreeterService { @GET @Path("greeting/{name}") GreeterInfo greetMe(@PathParam("name") String name) throws GreeterException; }
|
2.实现此接口
3.发布服务。同发布其他spring-osgi服务方式一样,DOSGi支持spring-osgi的方式发布RESTful服务,只需要在服务注册时设置DOSGi的相关属性就将此服务同时注册到CXF中
<beans xmlns:osgi="..."> <osgi:service interface="org.apache.cxf.dosgi.samples.springdm.DinnerService"> <osgi:service-properties> <entry key="service.exported.interfaces" value="*" /> </osgi:service-properties> <bean class="org.apache.cxf.dosgi.samples.springdm.impl.DinnerServiceImpl" /> </osgi:service> </beans>
|
注:相关属性设置参考http://cxf.apache.org/distributed-osgi-reference.html,但要注意的是在DOSGi1.1时属性项“org.apache.cxf.rs.provider”说明是错误的,不应该是boolean值而是自定义的provider的类名。
4.使用自定义的JSON数据绑定接口。之前说到的“org.apache.cxf.rs.provider”设置是为了使用Jackson的接口。如果使用自定义的provider还需要在服务发布bundle中导入org.codehaus.jackson.jaxrs的包(MANIFEST.MF中Import-package)
<beans xmlns:osgi="..."> <osgi:service interface="org.apache.cxf.dosgi.samples.springdm.DinnerService"> <osgi:service-properties> <entry key="service.exported.interfaces" value="*" /> <entry key=" org.apache.cxf.rs.provider" value=" org.codehaus.jackson.jaxrs. JacksonJsonProvider" /> </osgi:service-properties> <bean class="org.apache.cxf.dosgi.samples.springdm.impl.DinnerServiceImpl" /> </osgi:service> </beans>
|