Java 可以使用多个Servlet和Camel Servlet吗?
我想通过我的应用程序公开3个API。模式如下: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() {
- /api/ui/*(由Spring处理)映射到servlet 1
- /api/api1/*(由Camel的servlet组件处理)映射到servlet 2
- /api/api2/*(由Camel的servlet组件处理)映射到servlet 3
@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")