最近リリースされた Stringtemplate 4 のベータ版に問題があります。
StringTemplate 3 では、次のようなテンプレートを使用していました。
<env_vars:{ var | void* <var>() { return null; }}>
つまり、リテラルの右中括弧 ("}") を含む無名テンプレートであり、これらは最初の右中括弧をエスケープすることなく、ST3 で十分に機能しました。
ST4 を使用すると、NPE が発生します (以下のテスト ケースはスタック トレースを出力します)。リテラルの右中括弧をエスケープすることで機能させることができるため、テンプレートは次のようになります (最初の右中括弧の前にある引用符のバックスラッシュに注意してください)。
<env_vars:{ var | void* <var>() { return null; \}}>
しかし、それは少し醜いようです。私は常に ST の邪魔にならない構文を賞賛してきましたが、出力される各 "{" を対応する "\}" と一致させる必要があることは、どういうわけか非常に非対称に思えます。
私が見逃しているものはありますか、それとも ST3 からの予想される動作の変更ですか?
テストケース:
org.stringtemplate.v4.ST をインポートします。 パブリック クラス ST4Test { public static void main(final String[] args) { final String[] env_vars = new String[]{"one", "two", "three"}; 試す { // これは ST3 では機能していましたが、ST4 では失敗します。 final ST failingST = new ST("<env_vars:{ var | void* <var>() { return null; }}\n>"); failingST.add("env_vars", env_vars); System.out.printf("%s\n", failingST.render()); } キャッチ(例外例) { // 失敗した例では NPE が発生します ex.printStackTrace(); } // これは機能しますが、匿名に含まれる「}」を引用符で囲む必要があります // テンプレート。ST を使用していることを考えると、少し気がかりです。 // ときどき "}" を使用する傾向がある C コードを生成します。 // これは ST3 で機能していたという事実。 final ST workingST = new ST("<env_vars:{ var | void* <var>() { return null; \\}\n}>"); workingST.add("env_vars", env_vars); System.out.printf("%s\n", workingST.render()); } }