我在使用驼峰中的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绑定和交换的文档,我认为我已经理解了这一点。但我必须遗漏一些东西。
答案 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。