给定模板定义的StringTemplate属性列表

6
我正在学习使用StringTemplate 4,并尝试从数据库中提取一个简单字符串并创建一个模板。我使用类似于以下的方法:
STGroup group = new STGroupString(null, someTemplateString, '$', '$');
ST st = group.getInstanceOf(someTemplateName);
st.add(someAttribute, someValue);

如果我定义的属性与模板someTemplateName相同或少于它,那么一切都正常。但是,如果我尝试添加一个不存在的属性,就会出现以下异常:

no such attribute: fake
java.lang.IllegalArgumentException: no such attribute: fake
  ...

这是有意义的。然而,似乎我无法事先知道为模板someTemplateName定义了哪些属性。我希望能找到像下面这样的内容:

bool isDef = st.isDefined(someAttribute);

但是没有这样的方法。我是正确的吗?有什么解决办法吗?

2个回答

4
CompiledST文档中提到的tokens仅用于调试,不太清楚具体含义。
ST template = new ST("Hello <username>, how are you? Using <if(condition)>expression<endif> in condition works, and repeating <username> is not a problem.");
Set<String> expressions = new HashSet<String>();
TokenStream tokens = template.impl.tokens;
for (int i = 0; i < tokens.range(); i++) {
    Token token = tokens.get(i);
    if (token.getType() == STLexer.ID) {
        expressions.add(token.getText());
    }
}

为您提供字符串 usernamecondition


1
您可以使用st.impl.formalArguments访问定义参数的Map<String, FormalArgument>。请注意,对于某些模板,此字段将为null

2
st.impl.formalArguments 只会给出你在模板中定义的参数,而不会给出所使用属性的名称。 - Matthijs Bierman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接