Camel更新到2.17.1导致Servlet上的404

时间:2017-01-17 15:43:55

标签: tomcat servlets apache-camel

我正在使用Camel和Tomcat以及Spring。我使用的是Camel 2.15.0并更新为2.17.1。我没有对我的web.xml进行任何其他更改,但现在我运行到端点(在Tomcat容器中运行)的测试得到404.Tomcat日志只显示"POST / HTTP/1.1" 404。 Camel 2.17如何处理Servlet组件有什么不同吗?

我的web.xml:

 <!-- Camel servlet -->
 <servlet>
   <servlet-name>http-ingest</servlet-name>
   <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <!-- Camel servlet mapping -->
 <servlet-mapping>
    <servlet-name>http-ingest</servlet-name>
    <url-pattern></url-pattern>
 </servlet-mapping>

我的RouteBuilder:

from("servlet://*?servletName=http=ingest")
      ...

更新

所以我做了一些回归测试,我编译了一个使用camel 2.15.0的旧版本项目,我的HTTPS测试工作正常。然后,我所做的唯一更改是将骆驼版本更新为2.17.1,重新编译,部署并重新进行测试。在2.17.1中,我得到了404.再次,除了改变我的pom中的骆驼版本之外,我没有做任何改变。

1 个答案:

答案 0 :(得分:1)

好的,所以我花了一些时间在这上面,发现有一些与CamelHttpTransportServlet分支和2.15.x分支不同的2.17.x提交。这些与第44行有关(见参考文献1)。不幸的是,我们似乎没有注入不同的策略。 默认策略似乎支持在新HttpRestServletResolveConsumerStrategy中定义新的REST DSL样式。

当我阅读HttpRestServletResolveConsumerStrategy实现时,我看到一些可能需要一些可能导致问题的进一步文档的事情。例如,新策略期望request.getPathInfo()的返回值为非null(参见参考文献2的第36行)。此外,此策略依赖于RestConsumerContextPathMatcher(参考3)来检查路径中的通配符。

此外,当我查看文档和源代码时,所有内容(包括文档和代码)似乎都假设servlet被部署为不是应用服务器中的根的war。我不认为这会是一个大问题,但我想知道如何设置server.xml配置以映射你的战争,以防你部署到root。

Definetely看起来像一个不起眼的问题。 :)

我希望这些有帮助!

参考文献:

  1. https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java
  2. https://github.com/apache/camel/blob/555627d49e48df00f325ec05f382b79415cadffc/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpRestServletResolveConsumerStrategy.java
  3. https://github.com/apache/camel/commit/a90d28d1c48594bf3f1765a5dbe34c07f99a9960
  4. Tomcat8 use the app as ROOT.war