让 Restlet 与 HTTP Servlet 一起工作
Have Restlet working alongside HTTP Servlets
在现有的 Java SE 项目中,我的同事依赖于内部服务器实现,在 Restlet 中实现了一堆 Web 服务。这在漫长的运行中证明是不够的,所以我们迁移到基于jetty 9的服务器引擎,缺点是Restlet did not support it back then。这并没有阻止团队,现在有相当多的 "raw" HTTP servlets 是用我们的业务逻辑实现的。
由于事实证明这已成为实现 Web 服务的一种令人沮丧的方式,我们现在希望为未来的服务恢复 Restlet,并使它们与这些 servlet 一起工作。我的研究没有发现任何关于进行此类集成的重要线索,除了 Request and Response wrapper to the HTTP counterparts 仍在进行中并标记为计划外。此外,这些 servlet 的现有工作量很大,这就是为什么我将转换为 Restlet 资源作为最后的手段。
总而言之,我怎样才能使 Restlet 应用程序与同一服务器中的 HTTP servlet 一起工作? Java SE 中有没有办法将 Rest 应用程序附加到 servlet 容器?或者反过来想,有没有办法通过一些额外的手段将原始 servlet 附加到应用程序,例如可以应用于任何 HTTP servlet 的 Servlet-to-Resource 包装器?可以接受任何可行的非侵入性解决方案。
如果我正确理解了你的问题,你想在 servlet 容器中嵌入一个 Restlet 应用程序。在这种情况下,您应该使用扩展名 org.restlet.ext.servlet
。后者提供了一个入口 servlet,将请求分派到 Restlet 应用程序的服务器资源
有关如何配置此功能的更多详细信息,请参阅此 link:https://github.com/restlet/restlet-tutorial/blob/master/modules/org.restlet.tutorial.markdown/02_Server_Side/04_Server_Deployment/02_Servlet_Deployment.md。
似乎 org.restlet.ext.servlet
包与 Java SE 版本的 Restlet 兼容,即使它列在 Java EE 组中。以下是将遵循的步骤:
创建一个 ServletAdapter
,它将 HTTP servlet 请求和响应转换为高级 restlet 表示。文档本身建议封装它。
public class RestletHttpServlet extends HttpServlet {
private ServletAdapter adapter;
private final Restlet restlet;
public RestletHttpServlet(Restlet restlet) {
this.restlet = restlet;
}
@Override
public void init() throws ServletException {
super.init();
this.adapter = new ServletAdapter(getServletContext());
this.restlet.setContext(this.adapter.getContext());
this.adapter.setNext(this.restlet);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.adapter.service(req, resp);
}
}
有了这个助手 class,只需创建新的 restlet 并将它们附加到 servlet API(在此处使用上下文处理程序):
Restlet myRestlet = ...
ServletContextHandler cHandler = new ServletContextHandler();
cHandler.addServlet(new ServletHolder(new RestletHttpServlet(myRestlet)), "/myRestlet/*");
ContextHandlerCollection contextHandlers = new ContextHandlerCollection();
contextHandlers.setHandlers(new Handler[]{cHandler});
server.setHandler(contextHandlers);
路由器、资源和模板路径似乎也能正常工作。使第一个 restlet 成为 Application
也是可能的,并且通常有助于完整的上下文初始化。
在现有的 Java SE 项目中,我的同事依赖于内部服务器实现,在 Restlet 中实现了一堆 Web 服务。这在漫长的运行中证明是不够的,所以我们迁移到基于jetty 9的服务器引擎,缺点是Restlet did not support it back then。这并没有阻止团队,现在有相当多的 "raw" HTTP servlets 是用我们的业务逻辑实现的。
由于事实证明这已成为实现 Web 服务的一种令人沮丧的方式,我们现在希望为未来的服务恢复 Restlet,并使它们与这些 servlet 一起工作。我的研究没有发现任何关于进行此类集成的重要线索,除了 Request and Response wrapper to the HTTP counterparts 仍在进行中并标记为计划外。此外,这些 servlet 的现有工作量很大,这就是为什么我将转换为 Restlet 资源作为最后的手段。
总而言之,我怎样才能使 Restlet 应用程序与同一服务器中的 HTTP servlet 一起工作? Java SE 中有没有办法将 Rest 应用程序附加到 servlet 容器?或者反过来想,有没有办法通过一些额外的手段将原始 servlet 附加到应用程序,例如可以应用于任何 HTTP servlet 的 Servlet-to-Resource 包装器?可以接受任何可行的非侵入性解决方案。
如果我正确理解了你的问题,你想在 servlet 容器中嵌入一个 Restlet 应用程序。在这种情况下,您应该使用扩展名 org.restlet.ext.servlet
。后者提供了一个入口 servlet,将请求分派到 Restlet 应用程序的服务器资源
有关如何配置此功能的更多详细信息,请参阅此 link:https://github.com/restlet/restlet-tutorial/blob/master/modules/org.restlet.tutorial.markdown/02_Server_Side/04_Server_Deployment/02_Servlet_Deployment.md。
似乎 org.restlet.ext.servlet
包与 Java SE 版本的 Restlet 兼容,即使它列在 Java EE 组中。以下是将遵循的步骤:
创建一个 ServletAdapter
,它将 HTTP servlet 请求和响应转换为高级 restlet 表示。文档本身建议封装它。
public class RestletHttpServlet extends HttpServlet {
private ServletAdapter adapter;
private final Restlet restlet;
public RestletHttpServlet(Restlet restlet) {
this.restlet = restlet;
}
@Override
public void init() throws ServletException {
super.init();
this.adapter = new ServletAdapter(getServletContext());
this.restlet.setContext(this.adapter.getContext());
this.adapter.setNext(this.restlet);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.adapter.service(req, resp);
}
}
有了这个助手 class,只需创建新的 restlet 并将它们附加到 servlet API(在此处使用上下文处理程序):
Restlet myRestlet = ...
ServletContextHandler cHandler = new ServletContextHandler();
cHandler.addServlet(new ServletHolder(new RestletHttpServlet(myRestlet)), "/myRestlet/*");
ContextHandlerCollection contextHandlers = new ContextHandlerCollection();
contextHandlers.setHandlers(new Handler[]{cHandler});
server.setHandler(contextHandlers);
路由器、资源和模板路径似乎也能正常工作。使第一个 restlet 成为 Application
也是可能的,并且通常有助于完整的上下文初始化。