在现有的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包装器?任何可行的,非侵入性的解决方案都可以接受。
答案 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
也是可能的,并且通常有助于完整的上下文初始化。