骆驼 - 从路由传递特定参数到通用Bean方法

14

假设我有一个像这样的骆驼路线:

from("direct:myRoute")
        .setHeader("someHeader", simple("some header value"))
        .beanRef("myBean", "beanMethod");

我有一颗豆子,无法修改,长这样:

public class MyBean {
    public void beanMethod(String headerExpected) {
        // do something with the value here.
    }
}
基本上,我想从 myRoutesomeHeader 的值传递给 MyBean 中的 beanMethod。已知 beanMethod 可以接受一个 String,我该如何传递路由中 someHeader 的值,使其在 beanMethod 内被接受为一个字符串?
2个回答

27
您可以像这样按照您所描述的方式传递参数:
from("direct:myRoute")
.setHeader("someHeader", simple("some header value"))
.to("bean:myBean?method=beanMethod(${header.someHeader})")

更多信息,包括bean绑定的其他方法,请参阅http://camel.apache.org/bean-binding.html


感谢回答,@matthew-wilson。想再深入一点,如果我想将这个bean调用的输出保存到一个头部(header)中,我该怎么做呢?我期望的代码是类似于setHeader("anotherHeader", simple("bean:myBean?method=beanMethod(${header.someHeader})")) - abbasdgr8
2
该方法的返回类型为void,因此bean不会有任何输出。如果您将其返回类型更改为“String”,则在调用.to(.. bean调用后,消息正文将成为方法调用的输出。然后,您可以执行setHeader(“anotherHeader”,simple(“$ {body}”)) - Matthew Wilson
1
值得一提的是,此解决方案也适用于属性.to("bean:myBean?method=beanMethod(${property.propKey})"。(在Camel 2.10上进行了测试) - Alessandro Da Rugna
1
@abbasdgr8,你也可以使用.setHeader("anotherHeader", method(MyBean.class))。这将调用MyBean中的方法(如果需要,您可以指定哪个方法),并设置标头值;它不会修改Exchange主体。 - DavidS
如果 myBean.beanMethod(Object o) 不仅仅是 (String ...),例如 myBean.beanMethod(org.apache.camel.Message m),那么 URL 会是什么样子? - Gerold Broser
或者您可以使用.bean(MyBean.class, "beanMethod"),然后在调用bean时使用MyBean.beanMethod(MyObject, Exchange),其中MyObject是消息对象。然后当然可以使用Exchange访问头和属性。 - Gerry

2

这些答案似乎有点过时。以下是我使用的现代Camel方法。您可以使用@Headers注释在bean中检索标头值,并且可以通过传递类和方法名称来调用bean方法。

路由类

public class MyRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("direct:myRoute")
            .setHeader("myHeader", simple("my header value"))
            .bean(MyBean.class, "handle");
    }

}

Bean Class

public class MyBean {
    
    public static void handle(@Header("myHeader") String headerVal) {
        // do something with header
        System.out.println("myHeader: " + headerVal);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接