我使用freemarker为xml中的自定义变量格式化模板,如_prop.Var1。下面是我在地图中保存所有道具的上下文并尝试使用地图格式化变量的数据。
< myDoc>
<道具>
< prop name =" Var1"值=" XXX" />
< /道具>
< myEle att1 =" $ {_ prop.Var1}" />
< / myDoc>
以下是我正在使用的代码段:
template.process(variables,out);
注意:变量是一个包含名称值对的所有属性的映射。 变量:{Var1:XXX},尝试使用map:{_ prop.Var1:XXX},但这也无效。
以下是使用上述代码行时获得的异常。
FTL堆栈跟踪("〜"表示与嵌套相关):
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]
请帮我解决这个问题。
提前致谢。
答案 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规范所述)。