【问题标题】:Have Restlet working alongside HTTP Servlets让 Restlet 与 HTTP Servlet 一起工作
【发布时间】:2015-05-14 21:42:00
【问题描述】:

在一个现有的 Java SE 项目中,我的同事在 Restlet 中实现了一堆 Web 服务,依赖于内部服务器实现。从长远来看,这被证明是不够的,因此我们迁移到了基于 jetty 9 的服务器引擎,最大的缺点是Restlet did not support it back then。这并没有阻止团队,现在我们的业务逻辑实现了相当多的“原始”HTTP servlet。

由于这成为实现 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 包装器?任何可行的、非侵入性的解决方案都可以接受。

【问题讨论】:

    标签: java servlets jetty restlet java-server


    【解决方案1】:

    如果我正确理解您的问题,您希望在 servlet 容器中嵌入一个 Restlet 应用程序。在这种情况下,您应该使用扩展名org.restlet.ext.servlet。后者提供了一个入口 servlet,它将请求分派到 Restlet 应用程序的服务器资源

    有关如何配置此功能的更多详细信息,请参阅此链接:https://github.com/restlet/restlet-tutorial/blob/master/modules/org.restlet.tutorial.markdown/02_Server_Side/04_Server_Deployment/02_Servlet_Deployment.md

    【讨论】:

    • 我们有一个独立的 Java SE 服务器应用程序,org.restlet.ext.servlet 是用于 EE 版本的 Restlet。除非在 SE 版本上有解决方法,否则恐怕不会有帮助。
    • 我再次阅读了您的问题,现在更清楚了。您能否告诉我您的 servlet 从请求和响应(尤其是标头)中确切使用的内容?然后我可以为您提供一个实现...我们可以增量工作并将这项工作回馈给 Restlet ext.servlet 扩展。这种方法适合你吗?
    • 好吧,他们似乎只检索任意查询字符串参数并通过打印字符串并设置适当的内容类型来发送响应实体。这对我来说不再是优先事项,但如果你采取任何主动行动,可以告诉我。
    • 好的。我很快就会为你提供一些东西来做这件事;-) 我不会忘记你的要求......
    【解决方案2】:

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

    使用这个帮助类,只需创建新的 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 也是可能的,并且通常有助于完整的上下文初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2016-10-06
      • 2011-11-30
      • 2014-02-19
      • 2011-09-03
      • 2013-05-01
      相关资源
      最近更新 更多