Java 骆驼测试模板使用的交换与我发送的交换不同

Java 骆驼测试模板使用的交换与我发送的交换不同,java,apache-camel,Java,Apache Camel,我有以下测试: public class MyTest extends CamelSpringTestSupport { @Override protected AbstractXmlApplicationContext createApplicationContext() { return new ClassPathXmlApplicationContext(new String[] { "classpath:my-config

我有以下测试:

public class MyTest extends CamelSpringTestSupport {

    @Override
    protected AbstractXmlApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext(new String[] {
                "classpath:my-config.xml",
                });
    }

    @Test
    public void testSomething() throws Exception {

        Exchange exchange = new DefaultExchange(context);
        exchange.getIn().setHeader("myId", "1234");
        MessageContentsList parameters = new MessageContentsList();
        parameters.add(0, "");
        parameters.add(1, "1234");
        exchange.getIn().setBody(parameters);

        System.out.println("exchange before = " + System.identityHashCode(exchange)); //1657040467

        template.send("direct:myRoute", exchange);

        Object object = exchange.getOut().getBody();

        System.out.println("result = " + object); //null
        System.out.println("exchange after = " + System.identityHashCode(exchange)); //1657040467

        assertFalse(exchange.isFailed());
    }
}
以下是路线“direct:myRoute”中的最后一步:

我的路由由
RouteBuilder
类定义,我通过

<camelContext id="mainContext" xmlns="http://camel.apache.org/schema/spring">

    <packageScan>
        <package>com.my.route</package>
    </packageScan>

</camelContext>
如您所见,当我从测试中调用路由时,我无法检索路由的输出,因为出于某种原因,在测试中它是一个不同的exchange对象(但是,原始exchange标头和属性以某种方式复制到路由中的exchange)。 当我用XML定义路由时,这个问题不会发生


这是为什么?当我从测试调用路由时,我如何检索路由结果?

我不是100%确定,但我不认为你可以这样写

template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
理想情况下应该是:

    Exchange out=null;
    out=template.requestBody("direct:myRoute", exchange);
    String body=out.getOut().getBody();
为此,需要将交换模式设置为InOut。 有关模板的更多信息:

你是说
out=template.send(…)
?否则无法编译。无论如何
out.getOut().getBody()
仍然是
null
。我认为我使用它的方式仍然有效,因为它实际上返回了输入交换。但这是一个实现细节,所以当然最好按照您提到的方式进行。但它仍然不起作用。我在输出交换上看不到任何数据。您是否将交换模式更改为InOut?顺便说一下,您可以编译,但必须更改为out=template.requestBody(“direct:myRoute”,“requestBody”,exchange.class);我忽略了InOut模式的部分。非常感谢。现在它工作了!
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
    Exchange out=null;
    out=template.requestBody("direct:myRoute", exchange);
    String body=out.getOut().getBody();