使用 freemarker 为自定义变量格式化 xml 模板

Posted

技术标签:

【中文标题】使用 freemarker 为自定义变量格式化 xml 模板【英文标题】:format xml template for the custom variables using freemarker 【发布时间】:2017-08-12 21:49:49 【问题描述】:

我使用 freemarker 为 xml 中的自定义变量格式化模板,例如 _prop.Var1。下面是我在地图中保存所有道具的上下文并尝试使用地图格式化变量的数据。

下面是我正在使用的代码 sn-p:

template.process(变量,输出);

注意:变量是一个映射,它包含名称值对的所有属性。 变量:Var1:XXX,尝试使用地图:_prop.Var1:XXX,但这也不起作用。

这是我在使用上述代码行时遇到的异常。


编辑:

freemarker.core.InvalidReferenceException:以下已评估为 null 或缺失: ==> 详细 [在第 1 行第 83 列的模板“模板”中]

提示:如果已知失败的表达式合法地引用了有时为 null 或缺失的内容,请指定一个默认值,如 myOptionalVar!myDefault,或使用 when-presentwhen -失踪。 (这些仅涵盖表达式的最后一步;要涵盖整个表达式,请使用括号:(myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??

FTL 堆栈跟踪(“~”表示嵌套相关):

- 失败于:$_prop.Var1 [在第 3 行第 63 列的模板“模板”中]

at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.UnexpectedTypeException.newDesciptionBuilder(UnexpectedTypeException.java:80) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.UnexpectedTypeException.<init>(UnexpectedTypeException.java:43) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.NonHashException.<init>(NonHashException.java:49) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.Dot._eval(Dot.java:48) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.Expression.eval(Expression.java:81) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.DollarVariable.accept(DollarVariable.java:59) ~[freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.Environment.visit(Environment.java:327) [freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.Environment.visit(Environment.java:333) [freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.core.Environment.process(Environment.java:306) [freemarker-2.3.25-incubating.jar:2.3.25]
at freemarker.template.Template.process(Template.java:386) [freemarker-2.3.25-incubating.jar:2.3.25]

请帮我解决这个问题。

提前致谢。

【问题讨论】:

您的问题不显示错误信息,只显示位置。 @ddekany 感谢您的回复。我添加了描述错误消息的堆栈跟踪。请帮忙。 不,错误消息仍然丢失。它显示在位置和堆栈跟踪之前。 @ddekany 再次感谢您的回复。粘贴了另一条消息(请参阅已编辑部分)。请立即检查并提供帮助。谢谢 你确定消息和它下面的strack跟踪来自同一个异常吗?因为错误消息在第 1 行第 83 列中引用了verbose(我什至在示例模板中都没有看到名为“verbose”的变量),而堆栈跟踪在第 3 行第 63 列中引用了_prop。无论如何,您发送的堆栈跟踪的东西表明点左侧的东西 (_prop) 不存在或者是null。您是否将其放入数据模型中,并使用该名称? 【参考方案1】:

我注意到您在说“尝试使用 map : _prop.Var1:XXX 但这也不起作用”。我不确定这到底是什么意思(比如,Java 代码是什么),但如果你尝试过类似 variables.put("_prop.Var1", "XXX") 的东西,那么这将不起作用,因为当你在模板中编写 _prop.Var1 时,FreeMarker 将首先查找_prop,如果找到,则在其中查找Var1。它不会查找“_prop.Var1”键(因为您必须在模板中写_prop\.Var1,以便它将点视为名称的一部分,而不是作为运算符)。要使模板中的_prop.Var1 起作用,您必须执行以下操作:

Map<String, Object> prop = new HashMap<>();
variables.put("_prop", prop);
prop.put("Var1", "XXX");
... add further subvariables to prop

顺便说一句,prop 不必是Map,它也可以是具有所需 bean 属性的 Java bean。因此,如果它是带有 public String getVar1() return "XXX"; 的公共类,那么您可以将其称为 _prop.var1(小写 v,正如 JavaBeans 规范所说的那样)。

【讨论】:

非常感谢!这就是我一直在寻找的,我的问题通过方法 variables.put("_prop", prop) 得到了解决,非常感谢:)

以上是关于使用 freemarker 为自定义变量格式化 xml 模板的主要内容,如果未能解决你的问题,请参考以下文章

freemarker 取值赋给变量

使用freemarker模板引擎生成word文档的开发步骤

struts 集成freemarker 无法定义局部变量

Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

如何在freemarker中自定义数字格式?

如何将时间字符串转换为自定义日期格式?