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

时间:2017-03-21 09:53:25

标签: java freemarker

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

< myDoc>

<道具>

< prop name =" Var1"值=" XXX" />

< /道具>

< myEle att1 =" $ {_ prop.Var1}" />

< / myDoc>

以下是我正在使用的代码段:

template.process(variables,out);

注意:变量是一个包含名称值对的所有属性的映射。 变量:{Var1:XXX},尝试使用map:{_ prop.Var1:XXX},但这也无效。

以下是使用上述代码行时获得的异常。

已编辑:

freemarker.core.InvalidReferenceException:以下内容已评估为null或缺失: ==>详细[在模板"模板"在第1栏第83栏

提示:如果已知失败的表达式在法律上是指某些有时为空或缺失的内容,则指定默认值,如myOptionalVar!myDefault,或使用< #if myOptionalVar ??> - 当 - 本<#其他>在缺失。 (这些仅涵盖表达式的最后一步;要覆盖整个表达式,请使用括号:(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]

请帮我解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我注意到您正在说&#34;尝试使用地图:{_ prop.Var1:XXX},但这也不起作用&#34;。我不确定这究竟是什么意思(比如,Java代码是什么),但是如果你尝试过类似variables.put("_prop.Var1", "XXX")的东西,那么那就不会起作用,因为你在模板中写了{ {1}}然后FreeMarker将首先查找_prop.Var1,如果找到了,那么它内部会查找_prop。它不会寻找&#34; _prop.Var1&#34; key(因为你必须在模板中编写Var1,以便它将点视为名称的一部分,而不是作为运算符)。要使模板中的_prop\.Var1起作用,您必须执行以下操作:

_prop.Var1

BTW Map<String, Object> prop = new HashMap<>(); variables.put("_prop", prop); prop.put("Var1", "XXX"); ... add further subvariables to prop 不必是prop,它也可以是具有所需bean属性的Java bean。因此,如果它是Map的公共类,那么您可以将其称为public String getVar1() { return "XXX"; }(小写_prop.var1,如JavaBeans规范所述)。