Spring DM中整合CXF-DOSGi

Spring DM中整合CXF-DOSGi

最近有需要用到OSGi+REST+JSON的架构组合,做了一些技术验证。这里将总结的一些经验记录下来。

OSGi框架选型:

使用了Spring-DM,主要用它的服务发布功能

一、RESTful框架选型

CXFRestLetRestEasyJersey4REST框架都是JAX-RSJSR311)的实现,验证期间对它们做了一个比较

 

CXF

RestLet

RestEasy

Jersey

License

ASL2.0

LGPL

ASL2.0

GPL+CDDL

OSGi支持

Good

Ok

No

No

Spring支持

Ok

Ok

Ok

Ok

优点

轻量级框架对业务入侵小

部署包灵活

 

 

缺点

独立bundle9M

自带providerJSON数据封结构复杂

REST标识必须写到实现类上

 

License限制太多

综合考虑CXF-DOSGi满足我们的需求:License友好、支持Spring-OSGi部署服务便利、入侵性小;

二、框架搭建

由于CXF-DOSGi自带的JSON数据绑定接口有着这样那样的问题,所以需要借助其他的数据绑定接口。Jackson是一个不错的选择。(为什么不是支持非OSGi版本CXFjettison,是因为jettison没有Java对象和JSON数据相互转化的接口,使用起来没有Jackson便利)。

Spring-DM中集成DOSGi非常简单,只要在Spring-DM的加载plan文件中加上DOSGiJackson3bundlecoremapperjaxrs),整个框架就支持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.MFImport-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>

 

 

你可能感兴趣的:(apache,spring,json,框架,osgi)