1

Antlr 4 RC1 (完全な jar) を使用して文法を解析し、カスタム ast を構築し、その AST から stringtemplate4 を使用してコードを生成しています (antlr jar で stringtemplate クラスを使用しています)。テンプレート内で、Bean のリストを使用して別のテンプレートを呼び出します。

<subtemplate(myListArg=parm.listOfBeans)>

次に、サブテンプレート内で文字列のリストを取得します (各文字列は、文字列に評価される Bean の 1 つです)。しかし、Bean の値ではなく、Bean のプロパティを処理したいので、Java Bean のリスト (プロパティを持つ単純な Java オブジェクトなど) が必要です。

<subtemplate(myListArg)> ::= <<
  <myListArg: {x | {... <x.someProperty> ...}>
>>

テンプレートのパラメーターは常に文字列に評価されるように見えます。それは意図した動作ですか?はいの場合、他に何を書くべきですか?

4

1 に答える 1

2

List以下で確認されるように、StringTemplate 4 は、サブテンプレートの呼び出し中に配列のメンバーまたは文字列をレンダリングしません。編集: この投稿のコメントに反対の主張があるにもかかわらず、ST4はサブテンプレートの呼び出し中に配列のメンバーまたは文字列をレンダリングしないことを繰り返します。配列またはリストに格納されている要素の型に違いはありません List

start(class) ::= <<
<fields(class.fields)>
>>

fields(fieldsArray) ::= <<
<fieldsArray:{field | <field.name>}; separator="\n">
>>

startテンプレートのインスタンスを作成Integer.classしてclassパラメーターを渡すと、次の出力が得られます。

MIN_VALUE
MAX_VALUE
TYPE
SIZE

アプリケーションで次のいずれかが発生している必要があります。

  1. myListArg実際には文字列のリストではありません (つまり、予期しない出力が得られますが、ここにリストされている理由ではありません)
  2. プロパティの文字列のリストを返すModelAdaptorタイプの が登録されていますparmlistOfBeans
  3. の型にparmは、getListOfBeans文字列のリストを返すメソッドがあります
  4. 項目 (3) は成り立たず、型にparmは文字列のリストである listOfBeans フィールドがあります

編集:リストと配列の問題に関して、テンプレートnew Clazz(Integer.class)だけでなく、上記の単体テストを実行しました:Integer.classstart

private static class Clazz {
    private final Class<?> clazz;

    public Clazz(Class<?> clazz) {
        this.clazz = clazz;
    }

    public List<Field> getFields() {
        return Arrays.asList(clazz.getFields());
    }
}
于 2013-01-20T13:10:17.613 に答える