Camel Freemarker示例 - 模板返回Null

时间:2016-02-23 10:18:33

标签: java null apache-camel freemarker

问题:

我正在尝试从Camel网站here运行Camel Freemarker示例,因此我可以理解它们如何协同工作。但是,我有点麻烦。

正如您在下面的代码中看到的,一切都与文档中的内容完全相同。我改变了模板的位置,"来自"端点目录,以及ftl文件所在的位置。当我运行代码时,我收到以下错误:

FreeMarker template error:
The following has evaluated to null or missing:
==> headers.lastName [in template...]

堆栈跟踪添加了查找错误的提示,然后继续......

FTL Stack trace ("~" means nesting-related):
 - Failed at: ${headers.lastName} [in template...]

我的逻辑/我尝试过的事情:

现在,我不明白为什么找到headers.lastName为null。我认为msg.setHeader("lastName", "Ibsen");部分应该是为易卜生设定的。我想也许我应该尝试将名称设置为msg.setHeader("headers.lastName", "Ibsen");,但这不起作用。

在那之后,我不太确定还有什么可以寻找的。我对Camel和Freemarker都很新。我认为在交流期间没有收到任何东西,但我不确定是什么。 有人可以解释为什么这不起作用吗?

感谢任何建议。

代码:

这是ftl:

Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}

这是Java代码:

public class FreemarkerExample  extends CamelTestSupport{

    private static Configuration cfg = null;

    static {
        cfg = new Configuration(new version("2.3.0"));
    }

    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.enableHangupSupport();
        main.addRouteBuilder(new FreemarkerExample().new MyRouteBuilder());
        main.run();
    }

    private Exchange createLetter() throws IOException, TemplateException{
        Exchange exchange = context.getEndpoint("direct:a").createExchange();

        Message msg = exchange.getIn();
        msg.setHeader("firstName", "Claus");
        msg.setHeader("lastName", "Ibsen");
        msg.setHeader("item", "Camel in Action");
        msg.setBody("PS: Next beer is on me, James");

        return exchange;
    }

    @Test
    public void testFreemarkerLetter() throws Exception {
        MockEndpoint mock = getMockEndpoint("mock:result");
        mock.expectedMessageCount(1);
        mock.message(0).body().contains("Dear Ibsen, Claus");
        mock.message(0).body().contains("Thanks for the order of Camel in Action.");

        template.send("file:C:\\freemarkerExampleFile", createLetter());

        mock.assertIsSatisfied();
    }

    class MyRouteBuilder extends RouteBuilder {

        public void configure() throws Exception {
            from("file:C:\\freemarkerExampleFile\\templates")
                    .to("freemarker:file:C:\\freemarkerExampleFile\\templates\\letter.ftl")
                    .to("mock:result");
        }

    }

}

1 个答案:

答案 0 :(得分:0)

由于“文件”消费者,此测试无效。

文件使用者将GenericFile作为正文发送到路线中,并将标题设为CamelFileNameCamelFileLastModified

当你这样做时:

template.send("file:C:\\freemarkerExampleFile", createLetter());

您正在“freemarkerExampleFile”文件夹中创建一个文件。此文件将具有生成的名称,文件的内容是您的消息正文(即“PS:下一个啤酒在我身上,詹姆斯”)。标题丢失了。

然后,当您使用from("file:C:\\freemarkerExampleFile")进行轮询时,您将读取此文件夹中的每个文件,发送GenericFile,并在此GenericFile上应用您的模板:它失败。

你想要一个接收Exchange的路由,并将模板写入文件,你可以写:

CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {

  @Override
  public void configure() throws Exception {
    from("direct:test")
        .to("freemarker:classpath:/resources.fm")
        .to("file:target"); 
  }
});
context.start();

Map<String, Object> headers = new HashMap<String, Object>();
headers.put("firstName", "Claus");
//...
context.createProducerTemplate().sendBodyAndHeaders(
        "direct:test", 
        "PS: Next beer is on me, James",
        headers);

然后您可以将您的交换发送到端点“direct:test”