为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2022-08-03 16:37:50
我想通过我的应用程序公开 3 个 api。模式如下:/api/ui/* (由 Spring 处理) 映射到 servlet 1/api/api1/*(由 Camel 的 servlet 组件处理)映射到 servlet 2/api/api2/*(由 Camel 的 servlet 组件处理)映射到 servlet 3看来我不能用骆驼做到这一点...这就是我注册 servlet 2 的方式:@Beanpublic 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
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

不确定它是否有效,但您可以尝试这种可能的解决方法:强制使用 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")


查看完整回答
反对 回复 2022-08-03
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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

问题在于,骆驼一方面只支持唯一的“servlet”组件,所以如果添加“servlet1”ServletComponent也无济于事,它最终还是会用“servlet”。

虽然您可以指定许多 RestConfigurations,但将选择“servlet”的唯一配置。

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

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


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号