我们一直在java中使用字符串模板,并且刚刚升级到String Template 4.0.7。
在字符串模板3.2(我们之前使用的版本)中,我在stringtemplate.st
中有一个名为src/main/resources
的字符串模板文件,我们只是有一个名为“我们喜欢的任何内容”的组,因为它没有似乎有所作为,并加载模板如下:
final StringTemplateGroup group = new StringTemplateGroup("groupName");
final StringTemplate xmlMessage = group.getInstanceOf("stringtemplate");
更新到4.0.7后,如果您希望加载单个文件,我的理解是您需要一个STGroupDir
对象,其中包含模板所在文件夹的名称。
所以,我将stringtemplate文件移动到src/main/resources/templates
并将上面的代码更改为:
final URL url = Thread.currentThread().getContextClassLoader().getResource("templates");
final STGroup group = new STGroupDir(url.getPath(), '$', '$');
final ST xmlMessage = group.getInstanceOf("stringtemplate");
当我尝试填充字符串模板时,这会导致抛出空指针,并且看起来没有找到模板。
我的理解是传递给STGroupDir构造函数的String应该是模板文件所在的目录,如果在那里找不到模板文件,那么无论如何都会搜索类路径。 我从根本上误解了什么吗?关于我做错了什么的建议?
答案 0 :(得分:2)
很抱歉很快就回答了我自己的问题,但似乎我的.st文件中的语法错误了。我已经在顶部声明了参数,但我没有意识到示例中的x表示文件名。 所以,我有:
x(message) ::= <<
<?xml version="1.0" encoding="UTF-8"?> ...
>>
我将其替换为:
stringtemplate(message) ::= <<
<?xml version="1.0" encoding="UTF-8"?> ...
>>
它有效。 感谢this question帮助我解决问题的答案。