我正在使用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
?
答案 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)
);