从Camel中获取Bean的返回值(Java)

时间:2016-04-25 18:43:44

标签: java variables apache-camel

我在使用驼峰中的bean获取返回值并在我的路径中使用它时遇到了一些麻烦。

我有一条看起来像这样的路线:

from(file:test/?delete=true)
.unmarshal(jaxb)
.bean(testBean, "testMethod")
.to(direct:nextRoute);

bean看起来像这样:

public void testBean (PojoName pojoInstance){
  //do stuff 
  int i= 75; //a number I generate within the bean after I've started this method
}

我想在我的bean和我的路线中使用我生成的数字。像这样:

from(file:test/?delete=true)
    .unmarshal(jaxb)
    .bean(testBean, "testMethod")
    .log(integer generated from testBean)
    .to(direct:nextRoute); 

我尝试了什么:
所以,我没有在我的bean中返回void,而是将返回类型更改为int并返回整数。然后,我希望在我的路线上做这样的事情:

.log("${body.intFromBean}")

我的想法是,一旦我从bean返回值,它应该将该值存储在交换体中(至少是我从Camel文档中得到的)。然后,我可以在我的路线中访问它。

问题:
但是,当我将testBean返回类型更改为int时,我收到以下错误:

org.apache.camel.CamelExecutionException: Execution occurred during execution on the exchange 
Caused by: org.apache.camel.InvalidPayloadException: No body available of type: PojoName but has value: numberIGenerated of type java.lang.Integer

(抱歉,我没有完整的堆栈跟踪。我正在使用s.o移动应用程序)

我的问题:
从阅读其他一些s.o.提交,我想我明白了这个问题。消息体是一种类型,返回类型是另一种类型。但是,即使我尝试使用。

.convertTo(Integer.class)
在调用bean之前

,但那也没有用。 (从概念上讲,这不会起作用,因为如果我在解组之后将其转换为int,我就无法使用未编组的数据。但我想我还是试试它)。

有人可以帮我理解如何正确返回整数并在我的路线中使用它吗?

我已经阅读了有关bean绑定和交换的文档,我认为我已经理解了这一点。但我必须遗漏一些东西。

2 个答案:

答案 0 :(得分:4)

我认为更简单的解决方案是:

public class TestBean {
     public int testMethod() {
        return 75;
    }
}

是否要将返回结果存储在标题或正文中应该是路径定义。

当您在Camel documentation中阅读时,默认行为是在正文中设置返回值:

TestBean testBean = new TestBean();

from("file:test/?delete=true")
    .unmarshal(jaxb)
    .bean(testBean, "testMethod")
    .log("${body}")
    .to("direct:nextRoute"); 

如果你想要它在标题中:

TestBean testBean = new TestBean();

from("file:test/?delete=true")
    .unmarshal(jaxb)
    .setHeader("MyMagicNumber", method(testBean, "testMethod"))
    .log("${header.MyMagicNumber}")
    .to("direct:nextRoute"); 

请注意,如果您使用的是早于2.10的Camel版本,则需要使用(现已弃用)" bean"方法而不是"方法"方法: - )

答案 1 :(得分:1)

根据您需要使用它,可以将其添加到标题中,也可以将其作为正文。

要将其添加到标题(键/值),请执行以下操作:

public class TestBean
{
     @Handler 
     public void testMethod
     (
        @Body Message inMessage,
        @Headers Map hdr,
        Exchange exch
     ) throws Exception
    {
        int i= 75;
        hdr.put("MyMagicNumber", i);

    }

}

您的“返回”结果现在存储在标题中,您可以在后面的步骤中从中读取它。

对于身体,请执行以下操作:

public class TestBean
{
     @Handler 
     public void testMethod
     (
        @Body Message inMessage,
        @Headers Map hdr,
        Exchange exch
     ) throws Exception
    {
        int i= 75;
        inMessage.setBody(i);

    }

}

邮件的正文现在将包含i。