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

Java StringTemplate为给定模板定义的属性列表,java,stringtemplate-4,Java,Stringtemplate 4,我开始学习StringTemplate4,并尝试从数据库中存储的简单字符串创建模板。我用这样的方式: STGroup group = new STGroupString(null, someTemplateString, '$', '$'); ST st = group.getInstanceOf(someTemplateName); st.add(someAttribute, someValue); 现在,如果我定义的属性小于或等于为模板someTemplateName定义的属性,那么一切都

我开始学习StringTemplate4,并尝试从数据库中存储的简单字符串创建模板。我用这样的方式:

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);
但是没有这样的方法。我说得对吗?有没有办法解决这个问题?

您可以使用访问定义参数的
映射。请注意,对于某些模板,此字段将为
null

状态
标记的文档仅用于调试。不知道那是什么意思

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());
    }
}
ST-template=new-ST(“你好,你好吗?在条件中使用表达式是有效的,重复不是问题”);
Set expressions=newhashset();
令牌流令牌=template.impl.tokens;
对于(int i=0;i

提供字符串
username
condition

st.impl.formalArguments
仅提供在模板上定义的参数。它不提供所用属性的名称。