class 作为 OSGi 环境中的 Servlet 和/或 JAX-RS 资源
A class as Servlet and / or JAX-RS resource in an OSGi environment
目前我在我的 OSGi 服务注册表中注册了 HttpServlets。这些由另一个组件处理并即时添加到 Jetty 服务器。这非常有效,我需要这个过程,例如在使用 Vaadin 或只是一个具有某些特定功能的普通 HttpServlet 时。
但是,我也想重新使用这种方法来注册使用 JAX-RS 的 Servlet(在我的例子中,当前是 Jersey 实现)。我的想法是简单地重新使用我的 HttpServlet 并添加 JAX-RS 注释。
当然这不是开箱即用的,因为注释不是由 OSGi 服务代理传递的,其他组件或服务器需要支持它。因此,我决定使用抽象 class 扩展 HttpServlet 来处理服务并将其传递给 Jersey ServletContainer。然后应使用包含原始 HttpServlets 对象的应用程序配置 ServletContainer 作为单例。
它似乎不起作用,我不明白为什么。错误是:
18:26:02.190 警告 o.g.jersey.internal.inject.Providers - 在 SERVER 运行时中注册的提供者 path.to.MyServlet 未实现适用于 SERVER 运行时的任何提供者接口。由于约束配置问题,提供程序 path.to.MyServlet 将被忽略。
我的Servlet:
@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));
}
}
}
如果您正在考虑在 OSGi 上执行 jax-rs,那么您应该看看 Aries JAX-RS whiteboard。
即将发布的 JAX-RS Whiteboard OSGi spec 的参考实现将成为 OSGi R7 版本的一部分。规格和参考效果应该会在几周内发布。
文档和示例仍然有点稀疏,但确实需要注意。
目前我在我的 OSGi 服务注册表中注册了 HttpServlets。这些由另一个组件处理并即时添加到 Jetty 服务器。这非常有效,我需要这个过程,例如在使用 Vaadin 或只是一个具有某些特定功能的普通 HttpServlet 时。
但是,我也想重新使用这种方法来注册使用 JAX-RS 的 Servlet(在我的例子中,当前是 Jersey 实现)。我的想法是简单地重新使用我的 HttpServlet 并添加 JAX-RS 注释。
当然这不是开箱即用的,因为注释不是由 OSGi 服务代理传递的,其他组件或服务器需要支持它。因此,我决定使用抽象 class 扩展 HttpServlet 来处理服务并将其传递给 Jersey ServletContainer。然后应使用包含原始 HttpServlets 对象的应用程序配置 ServletContainer 作为单例。
它似乎不起作用,我不明白为什么。错误是:
18:26:02.190 警告 o.g.jersey.internal.inject.Providers - 在 SERVER 运行时中注册的提供者 path.to.MyServlet 未实现适用于 SERVER 运行时的任何提供者接口。由于约束配置问题,提供程序 path.to.MyServlet 将被忽略。
我的Servlet:
@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));
}
}
}
如果您正在考虑在 OSGi 上执行 jax-rs,那么您应该看看 Aries JAX-RS whiteboard。
即将发布的 JAX-RS Whiteboard OSGi spec 的参考实现将成为 OSGi R7 版本的一部分。规格和参考效果应该会在几周内发布。
文档和示例仍然有点稀疏,但确实需要注意。