OSGi 4.2环境中的基本JAX-RS servlet

时间:2013-04-07 20:04:35

标签: jersey osgi jax-rs

在OSGi 4容器中创建基本JAX-RS环境的最简单方法是什么,而不需要使用像Apache CXF这样的重量级解决方案。

虽然在我看来注册一个带有HttpService的Jersey容器servlet应该可以解决这个问题,但是我还没有把几个捆绑包的集合拼凑起来。

这是我的bundle Activator的本质,Resources类实现Application接口来解析哪些类具有JAX-RS注释:

public void start(BundleContext context) throws Exception {
    // Find the HttpService
    ServiceReference ref = context.getServiceReference(HttpService.class.getName());
    HttpService service = (HttpService) context.getService(ref);    

    // Register a Jersey container
    ServletContainer servlet = new ServletContainer(new Resources());
    service.registerServlet("/services", servlet, null, null);
}

4 个答案:

答案 0 :(得分:4)

以下是适用于Jersey的示例应用程序:https://source.everit.biz/svn/everit-osgi/trunk/samples/jaxrs/

运行mvn install之后,你会在target / eosgi-testing-dist /上看到带有Jetty的runnable equinox容器。你可以找到lib文件夹中使用了哪些bundle。

它使用此解决方案:https://source.everit.biz/svn/everit-osgi/trunk/remote/jersey/

这是最简单的代码片段,它根据上面的解决方案完成了这个技巧(myObj是包含注释的对象):

javax.ws.rs.core.Application application = new DefaultResourceConfig();
application.getSingletons().add(myObj);

com.sun.jersey.spi.container.servlet.ServletContainer servletContainer =
       new ServletContainer(application);

Hashtable<String, String> initParams = new Hashtable<String, String>();
initParams.put("com.sun.jersey.api.json.POJOMappingFeature", "true");
httpService.registerServlet("/rest", servletContainer, initParams, null);

请注意,如果您想要使用JSON转换等功能,“initparams.put”非常有用。

<强>更新

用户/传递SVN链接:来宾/来宾

远程球衣项目不再维护,但仍可在github上使用:https://github.com/everit-org/osgi-remote-jersey

答案 1 :(得分:3)

Amdatu提供了一些开源RESTful服务包,包括基于Apache Wink的JAX-RS解决方案。

请参阅http://amdatu.org/components/web.html以获取说明,并tutorial video了解如何创建基本REST资源。

答案 2 :(得分:1)

这应该可以解决问题:https://github.com/hstaudacher/osgi-jax-rs-connector

使用此项目的发布者,您只需将OSGi服务注册为OSGi服务即可将其注册为RESTful Web服务;)

答案 3 :(得分:0)

帮助我的是关注文章:Setting Up JAX-RS for Equinox OSGI

关键点是:

  • 需要使用@Path手动注册球衣资源配置(@Providerorg.glassfish.jersey.server.ResourceConfig分配的类)。
  • 所有其他配置选项(使用javax.ws.rs.Applicationjersey.config.server.provider.packages的泽西自动发现)都将失败,因为Jersey服务器将无法在Equinox中扫描它们。
  • 在资源配置所在的软件包中实现ServletContainer