让Restlet与HTTP Servlet一起工作

时间:2015-03-12 16:08:28

标签: java servlets jetty restlet java-server

在现有的Java SE项目中,我的同事们在Restlet中实现了一堆Web服务,依赖于内部服务器实现。从长远来看,这是不合适的,所以我们迁移到基于jetty 9的服务器引擎,其缺点是Restlet did not support it back then。这并没有阻止团队,现在还有很多" raw" 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包装器?任何可行的,非侵入性的解决方案都可以接受。

2 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您希望在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

希望它有所帮助, 亨利

答案 1 :(得分:1)

似乎org.restlet.ext.servlet包与Restlet的Java SE版本兼容,即使它在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也是可能的,并且通常有助于完整的上下文初始化。