【问题标题】:A class as Servlet and / or JAX-RS resource in an OSGi environmentOSGi 环境中作为 Servlet 和/或 JAX-RS 资源的类
【发布时间】:2018-06-25 12:15:24
【问题描述】:

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

但是,我也想重新使用这种方法来注册使用 JAX-RS 的 Servlet(在我的情况下,当前是 Jersey 实现)。我的想法是简单地重用我的 HttpServlet 并添加 JAX-RS 注释。

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

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

18:26:02.190 警告 o.g.jersey.internal.inject.Providers - 在 SERVER 运行时注册的提供程序 path.to.MyServlet 未实现任何适用于 SERVER 运行时的提供程序接口。由于约束配置问题,提供程序 path.to.MyServlet 将被忽略。

MyServlet:

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

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

}

AbstractServlet:

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));
        }

    }
}

【问题讨论】:

    标签: servlets jersey jetty jax-rs osgi


    【解决方案1】:

    如果您正在考虑在 OSGi 上执行 jax-rs,那么您应该看看 Aries JAX-RS whiteboard

    这是即将发布的JAX-RS Whiteboard OSGi spec 的参考实现,它将成为 OSGi R7 版本的一部分。规范和参考实现应该会在几周内发布。

    文档和示例仍然有点稀疏,但肯定需要注意。

    【讨论】:

    • 谢谢,听起来很有趣。但也许我的方向也有解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多