在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);
}
答案 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
手动注册球衣资源配置(@Provider
,org.glassfish.jersey.server.ResourceConfig
分配的类)。javax.ws.rs.Application
或jersey.config.server.provider.packages
的泽西自动发现)都将失败,因为Jersey服务器将无法在Equinox中扫描它们。ServletContainer
。