0

我是一个非常基础的 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$>>

我得到以下结果,其中人员对象呈现为 _thePerson.toString()。

the person first name is: Ivan
999999999 - Johnson, Ivan G

任何帮助将不胜感激,因此我可以继续使用我正在尝试使用的更复杂的模板。

4

1 回答 1

0

回答我自己的问题:我认为这是这里介绍的答案 - https://theantlrguy.atlassian.net/wiki/display/ST4/Introduction

“...通常它们遵循旧的 JavaBeans 命名约定。StringTemplate 首先查找方法 getP()、isP()、hasP()。如果找不到这些方法之一,它会查找名为 p 的字段。”

我认为这意味着“p”也可以用作方法名称,但这是错误的。我正在使用企业对象框架,不幸的是,我的模型 .java 文件的属性访问器不使用“get*”约定,这意味着 ST 从不请求它们。它们也不存储为字段。我必须想办法解决它,但我不认为我倾向于改变大型模型框架来适应这种情况。如果我添加封面 (get*) 方法,它可以工作,但这不是最好的解决方案。

一般来说,我从来没有遇到过这个问题,因为 WebObjects 模板引擎会在有或没有“get*”的情况下呈现。

于 2015-10-09T01:51:30.833 回答