可能有多个带有骆驼服务包的Servlet吗?

我想通过我的应用程序公开 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” 属性,第一个组件获胜。


我不想有 /api/camel/api1/, /api/camel/api2/ for Camel Servlet...


我的 Apache Camel 版本是 2.21.5


鸿蒙传说
浏览 147回答 2
2回答

慕姐8265434

不确定它是否有效,但您可以尝试这种可能的解决方法:强制使用 servlet 组件的三个不同实例,以便调用 setter 不会影响所有实例。CDI版本(但原则仍然是春季)public class ServletFactory {      @Produces    @ApplicationScoped    @Named("servlet1")    public ServletComponent propertiesComponent() {             ServletComponent component = new ServletComponent();        ... // Customize instance here        return component;    }    @Produces    @ApplicationScoped    @Named("servlet2")    public ServletComponent propertiesComponent() {             ServletComponent component = new ServletComponent();        ... // Customize instance here        return component;    }    @Produces    @ApplicationScoped    @Named("servlet3")    public ServletComponent propertiesComponent() {             ServletComponent component = new ServletComponent();        ... // Customize instance here        return component;    }当然,您必须参考正确的名称:restConfiguration().component("servlet1")

小唯快跑啊

有很多方法可以通过 Apache Camel 中的 rest dsl 提供配置。因此,我花了很多时间进行调试以找出,如果你想拥有多个,就没有机会(在2.21.5中)选择要使用的servlet。问题在于,骆驼一方面只支持唯一的“servlet”组件,所以如果添加“servlet1”ServletComponent也无济于事,它最终还是会用“servlet”。虽然您可以指定许多 RestConfigurations,但将选择“servlet”的唯一配置。如果你尝试使用 RestEndpoint 的查询部分,那么问题在于,创建的正确设置了 servletNames 的 ServletEndpoints 无论如何都会与它们的 uri 发生冲突:“servlet:/health?httpMethodRestrict=GET”,因此你将只有一个...对于 REST,我需要切换到 Spring :(
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java