6

私は StringTemplate 4 を使い始めており、データベースに保存されている単純な文字列からテンプレートを作成しようとしています。私は次のようなものを使用します:

STGroup group = new STGroupString(null, someTemplateString, '$', '$');
ST st = group.getInstanceOf(someTemplateName);
st.add(someAttribute, someValue);

template に定義された属性のすべてまたはそれよりも少ない数を定義すると、すべてが正常に機能しますsomeTemplateName。存在しない属性を追加しようとすると、次の例外が発生します。

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

これは理にかなっています。ただし、 template にどの属性が定義されているかを事前に知る方法はないようですsomeTemplateName。私は次のようなものを見つけることを期待していました:

bool isDef = st.isDefined(someAttribute);

しかし、そのような方法はありません。私は正しいですか?これを回避する方法はありますか?

4

2 に答える 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());
    }
}

Stringsusernamecondition.

于 2016-03-07T22:20:19.767 に答える
1

を使用して、引数が定義されている場所st.impl.formalArgumentsにアクセスできます。Map<String, FormalArgument>一部のテンプレートでは、このフィールドは になりますnull

于 2013-12-04T04:28:35.703 に答える