Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用多个Servlet和Camel Servlet吗?_Java_Servlets_Apache Camel - Fatal编程技术网

Java 可以使用多个Servlet和Camel Servlet吗?

Java 可以使用多个Servlet和Camel Servlet吗?,java,servlets,apache-camel,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() {

我想通过我的应用程序公开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”属性,并且第一个wins

我不想让camelservlet使用/api/camel/api1/,/api/camel/api2/


我的Apache Camel版本是2.21.5

不确定它是否能工作,但您可以尝试一下这种可能的解决方法: 强制执行servlet组件的三个不同实例,以便调用setter不会影响所有实例

CDI版本(但原则仍适用于Spring)

当然,您必须引用正确的名称:

restConfiguration().component("servlet1")

在ApacheCamel中,有许多方法可以通过RESTDSL提供配置。 因此,我花了大量时间进行调试,以发现如果您想要多个servlet,那么(在2.21.5中)没有机会选择要使用的servlet

问题是,一方面,Camel只支持一个且唯一的“servlet”组件,因此,如果添加“servlet1”ServletComponent,它将不会有任何帮助,最终它仍将使用“servlet”

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

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


剩下的部分我需要切换到Spring:(

Ah!有趣的想法!我会尝试一下。谢谢!很遗憾,它不起作用!不能使用多个ServletComponents的原因主要是这一行:url=“servlet:///%s?httpMethodRestrict=%s”;任何ServletComponent都会在这一行之外创建一个端点。因此,只有一个ServletComponent的配置“servlet”组件将应用于任何创建的ServletEndpoint,我希望@Claus Ibsen能够看到这一点并帮助解决问题。
restConfiguration().component("servlet1")