Camel Freemarker 示例 - 模板 Returns Null
Camel Freemarker Example - Template Returns Null
问题:
我正在尝试 运行 Camel 网站 here 中的 Camel Freemarker 示例,以便我了解它们如何协同工作。但是,我遇到了一些麻烦。
正如您在下面的代码中看到的,一切都与文档中的内容几乎相同。我更改了模板所在的位置、"from" 端点目录以及 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...]
我的 Logic/What 我试过:
现在,我不明白为什么 headers.lastName 被发现为空。我认为 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");
}
}
}
由于 "file" 消费者,此测试无法进行。
文件消费者将 GenericFile
作为 Body 发送到路由中,并且 headers 如 CamelFileName
或 CamelFileLastModified
.
当你在做的时候:
template.send("file:C:\freemarkerExampleFile", createLetter());
您正在文件夹 "freemarkerExampleFile" 中创建文件。该文件将有一个生成的名称,文件的内容是您的消息的 body(即 "PS: Next beer is on me, James")。 headers 丢失了。
然后,当您使用 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"
问题:
我正在尝试 运行 Camel 网站 here 中的 Camel Freemarker 示例,以便我了解它们如何协同工作。但是,我遇到了一些麻烦。
正如您在下面的代码中看到的,一切都与文档中的内容几乎相同。我更改了模板所在的位置、"from" 端点目录以及 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...]
我的 Logic/What 我试过:
现在,我不明白为什么 headers.lastName 被发现为空。我认为 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");
}
}
}
由于 "file" 消费者,此测试无法进行。
文件消费者将 GenericFile
作为 Body 发送到路由中,并且 headers 如 CamelFileName
或 CamelFileLastModified
.
当你在做的时候:
template.send("file:C:\freemarkerExampleFile", createLetter());
您正在文件夹 "freemarkerExampleFile" 中创建文件。该文件将有一个生成的名称,文件的内容是您的消息的 body(即 "PS: Next beer is on me, James")。 headers 丢失了。
然后,当您使用 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"