我是一个非常基本的StringTemplate新手。我正在尝试利用此功能发送自动发送的电子邮件。我尽可能多地阅读消化那里的东西。我从一个简单的测试用例开始,无法获取要渲染的对象的属性。作为测试用例,我在模板文件email.stg中有以下内容。
delimiters "$", "$"
activate(person) ::= <<$person.personFirstName$>>
我正在尝试传递Person对象并让模板呈现personFirstName属性。这将调用getter Person.personFirstName(),它是公共的。
我的java代码如下:
Person _thePerson = //fetched from database
STGroup group = new STGroupFile(/tmp/email.stg);
ST st = group.getInstanceOf("activate");
st.add("person", _thePerson);
System.out.println("the person first name is: " + _thePerson.personFirstName());
System.out.println(st.render());
我的输出反映了personFirstName属性可以通过java获得,但我的模板不会呈现它。
the person first name is: Ivan
<nothing is returned here>
如果我将激活模板限制为:
activate(person) ::= <<$person$>>
我得到以下结果,其中person对象呈现为_thePerson.toString()。
the person first name is: Ivan
999999999 - Johnson, Ivan G
任何帮助都会非常感激,所以我可以继续使用我想要的更复杂的模板。
答案 0 :(得分:0)
回答我自己的问题:我认为这是导言的答案 - https://theantlrguy.atlassian.net/wiki/display/ST4/Introduction。
“...通常它们遵循旧的JavaBeans命名约定.StringTemplate首先查找方法getP(),isP(),hasP()。如果找不到其中一个方法,它会查找一个名为p“。
我认为这意味着“p”也可以作为一个方法名称,但是错了。我正在使用Enterprise Object Framework,不幸的是,我的模型.java文件的属性访问器不使用“get *”约定,这意味着ST从不请求它们。它们也不存储为字段。我将不得不考虑解决方法,但我认为我不倾向于改变大规模模型框架来适应这种情况。如果我添加cover(get *)方法,它可以工作,但这不是最好的解决方案。
通常,我从未遇到过这个问题,因为WebObjects模板引擎会在有或没有“get *。”的情况下呈现。