使用Camel Servlet可以使用多个servlet?

时间:2019-03-12 17:02:57

标签: java servlets apache-camel

我想通过我的应用程序公开3个api。模式如下:

  • / api / ui / *(由Spring处理)映射到servlet 1
  • / api / api1 / *(由Camel的servlet组件处理)映射到servlet 2
  • / api / api2 / *(由Camel的servlet组件处理)映射到servlet 3

似乎我不能用骆驼来做...

这就是我注册servlet 2的方式:

@Bean
public ServletRegistrationBean camelServletRegistrationBean() {
    final CamelHttpTransportServlet camelServlet = new CamelHttpTransportServlet();
    final ServletRegistrationBean servletBean = new ServletRegistrationBean(camelServlet, "/api/api1/*");
    servletBean.setName("servlet2");
    return servletBean;
}

public class Api1RestInputRoute extends RouteBuilder {


   restConfiguration().component("servlet").componentProperty("servletName", "servlet2");

   rest()
      .consumes(MediaType.TEXT_PLAIN_VALUE)
      .get("/health").to("log:api1");
}

public class Api2RestInputRoute extends RouteBuilder {


   restConfiguration().component("servlet").componentProperty("servletName", "servlet3");

   rest()
      .consumes(MediaType.TEXT_PLAIN_VALUE)
      .get("/health").to("log:api2");
}

看起来两个restConfigurations都在同一组件上设置了“ servletName”属性,并且第一个获胜。

我不想为Camel Servlet使用/ api / camel / api1 / ,/ api / camel / api2 / ...

我的Apache Camel版本是2.21.5

1 个答案:

答案 0 :(得分:0)

有很多方法可以通过Apache Camel中的rest dsl提供配置。 因此,我花了很多时间进行调试,以发现(如果要使用多个servlet,则在2.21.5中)没有机会选择要使用的servlet。

问题在于,骆驼一方面仅支持一个唯一的“ servlet”组件,所以如果您添加“ servlet1” ServletComponent则无济于事,最后它仍将使用“ servlet”。

尽管您可以指定很多RestConfigurations,但将选择“ servlet”的唯一配置。

并且,如果您尝试使用RestEndpoint的查询部分,那么问题在于,使用正确设置的ServletName创建的ServletEndpoints无论如何都会与它们的uri冲突:“ servlet:/ health?httpMethodRestrict = GET”,因此您将只有一个...

对于REST,我需要切换到Spring:(