Servlets 在OSGi环境中作为Servlet和/或JAX-RS资源的类

Servlets 在OSGi环境中作为Servlet和/或JAX-RS资源的类,servlets,jersey,jetty,jax-rs,osgi,Servlets,Jersey,Jetty,Jax Rs,Osgi,目前,我在OSGi服务注册表中注册了HttpServlets。这些由另一个组件处理并动态添加到Jetty服务器。这工作得非常好,我需要这个过程,例如当使用Vaadin或只是一个具有特定功能的普通HttpServlet时 然而,我也希望在使用JAX-RS注册servlet时重新使用这种方法(在我的例子中,目前是Jersey实现)。我的想法是简单地重用我的HttpServlet并添加JAX-RS注释 当然,这不是开箱即用的,因为注释不是由OSGi服务代理传递的,其他组件或服务器需要支持这一点。因此,

目前,我在OSGi服务注册表中注册了HttpServlets。这些由另一个组件处理并动态添加到Jetty服务器。这工作得非常好,我需要这个过程,例如当使用Vaadin或只是一个具有特定功能的普通HttpServlet时

然而,我也希望在使用JAX-RS注册servlet时重新使用这种方法(在我的例子中,目前是Jersey实现)。我的想法是简单地重用我的HttpServlet并添加JAX-RS注释

当然,这不是开箱即用的,因为注释不是由OSGi服务代理传递的,其他组件或服务器需要支持这一点。因此,我决定使用一个扩展HttpServlet的抽象类来处理服务并将其传递给Jersey ServletContainer。然后,ServletContainer应该配置一个应用程序,其中包括作为singleton的原始HttpServlets对象

它似乎不起作用,我不明白为什么。错误是:

18:26:02.190 WARN o.g.jersey.internal.inject.Providers-在服务器运行时中注册的提供程序path.to.MyServlet不会实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序path.to.MyServlet

MyServlet:

@Path("/")
public class MyServlet extends AbstractServlet {

    @GET @Path("/{path}")
    public Response root(@PathParam("path") String path) {
        // ...
    }

}
抽象servlet:

public abstract class AbstractServlet extends HttpServlet {

    private ServletContainer servletContainer = null;

    public AbstractServlet() {
        this.servletContainer = new ServletContainer(ResourceConfig.forApplication(new ApplicationAdapter(this)));
    }

    @Override
    public void destroy() {
        this.servletContainer.destroy();
    }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException,IOException {
        this.servletContainer.service(request, response);
    }

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { 
        this.servletContainer.service(request, response);
    }

    // ... (delegate all methods from HttpServlet to ServletContainer)

    @ApplicationPath("/")
    private class ApplicationAdapter extends Application {

        private final Object object;

        public ApplicationAdapter(final Object object) {
            this.object = object;
        }

        @Override
        public Set<Object> getSingletons() {
            return new HashSet<Object>(Arrays.asList(this.object));
        }

    }
}
公共抽象类AbstractServlet扩展了HttpServlet{
私有ServletContainer ServletContainer=null;
公共抽象servlet(){
this.servletContainer=newservletcontainer(ResourceConfig.forApplication(newapplicationadapter(this)));
}
@凌驾
公共空间销毁(){
this.servletContainer.destroy();
}
@凌驾
公共void服务(ServletRequest请求、ServletResponse响应)抛出ServletException、IOException{
this.servletContainer.service(请求、响应);
}
@凌驾
公共void服务(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
this.servletContainer.service(请求、响应);
}
//…(将所有方法从HttpServlet委托给ServletContainer)
@应用程序路径(“/”)
私有类ApplicationAdapter扩展了应用程序{
私有最终客体;
公共应用程序适配器(最终对象){
this.object=对象;
}
@凌驾
公共集getSingleton(){
返回新的HashSet(Arrays.asList(this.object));
}
}
}

如果您正在考虑在OSGi上实现jax rs,那么您应该看看

它是即将发布的OSGi R7版本的一部分的参考impl。规范和参考IMPL应在几周内发布


文档和示例仍然有点稀少,但它确实值得注意。

谢谢,听起来很有趣。但也许在我的方向上也有一个解决办法。