使用Guice和Undertow在Camel中使用rest Servlet

时间:2015-10-03 20:49:06

标签: java rest servlets apache-camel undertow

我正在使用Undertow进行设置和应用,我为静态文件设置了ResourceHandler,并且apache-camel使用Servlet来公开其他服务。

我在app容器中使用spring和servlet3.0完成了这项工作。

在扩展org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer

的课程中
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
    super.onStartup(servletContext);
    ServletRegistration.Dynamic servlet = servletContext.addServlet("RestServlet", new CamelHttpTransportServlet());
    servlet.setLoadOnStartup(1);
    servlet.addMapping("/rest/*");
}

在骆驼路线

restConfiguration()
            .component("RestServlet")
            .bindingMode(RestBindingMode.json)
            .dataFormatProperty("prettyPrint", "true");

非常接近http://camel.apache.org/servlet.html

中描述的内容

但如果我在Undertow中这样做,我会得到org.apache.camel.NoSuchBeanException: No bean could be found in the registry for: RestServlet of type: org.apache.camel.spi.RestConsumerFactory,因为我猜Guice永远不会找到由Undertow创建的servlet。我试图手动将CamelHttpTransportServlet暴露为Guice绑定,但这似乎没有改变。

ClassLoader classLoader = getClass().getClassLoader();
    ResourceHandler staticHandler = new ResourceHandler(new ClassPathResourceManager(classLoader, STATIC_RESOURCE_ROOT))
            .addWelcomeFiles(INDEX_HTML);

    DeploymentInfo deploymentInfo = Servlets.deployment()
            .setClassLoader(classLoader)
            .setContextPath(ROOT_MAPPING)
            .setDeploymentName(DEPLOYMENT_NAME)
            .addServlet(
                    Servlets.servlet("RestServlet", CamelHttpTransportServlet.class)
                            .addMapping(REST_MAPPING)
                            .setLoadOnStartup(1)
            );

    DeploymentManager manager = Servlets.defaultContainer().addDeployment(deploymentInfo);
    manager.deploy();

    PathHandler path = Handlers.path()
            .addPrefixPath(REST_MAPPING, manager.start())
            .addPrefixPath(ROOT_MAPPING, staticHandler);

    undertow = Undertow.builder()
            .addHttpListener(port, LOCALHOST)
            .setHandler(path)
            .build();
    undertow.start();

静态资源按预期工作,似乎其余的servlet正在运行并获得响应,但CamelContext将无法启动。

我不能在camel中使用restlet或任何东西,因为端口将被使用,所以我需要使用不同的端口用于静态文件和休息。 有没有办法让骆驼识别由Servlet发起的Undertow

1 个答案:

答案 0 :(得分:1)

好的,我终于找到了它出错的地方。

我怀疑我总是使用.component("servlet")而不是.component("RestServlet"),但Camel之前不会自动将其链接。

我将此部分更改为

restConfiguration()
            .bindingMode(RestBindingMode.json)
            .component("servlet")
            .dataFormatProperty("prettyPrint", "true")
            .endpointProperty("servletName", "RestServlet);

我将servlet映射更改为/*request.getPathInfo()的部署将在null内返回CamelHttpTransportServlet。 NB我遇到了一个问题,因为我最初将contextPath设置为/rest/*,这会搞乱会话和cookie

DeploymentInfo deploymentInfo = Servlets.deployment()
            .setClassLoader(classLoader)
            .setContextPath("/rest/")
            .setDeploymentName(DEPLOYMENT_NAME)
            .addServlet(
                    Servlets.servlet("RestServlet", CamelHttpTransportServlet.class)
                            .addMapping("/*")
                            .setLoadOnStartup(1)
            );