У меня проблема с недавно выпущенной бета-версией Stringtemplate 4 .
В StringTemplate 3 у меня были такие шаблоны, как
<env_vars:{ var | void* <var>() { return null; }}>
т.е. анонимные шаблоны, содержащие буквальную закрывающую скобку ("}"), и они работали достаточно хорошо в ST3, не выходя за пределы первой закрывающей скобки.
С ST4 я получаю NPE (тестовый пример ниже печатает трассировку стека). Я могу заставить его работать, избегая закрывающей литеральной скобки, поэтому шаблон выглядит следующим образом (обратите внимание на обратную косую черту в кавычках перед первой закрывающей скобкой):
<env_vars:{ var | void* <var>() { return null; \}}>
Но это кажется немного уродливым; Я всегда восхищался неинтрузивным синтаксисом ST, и необходимость сопоставления каждого "{" для вывода с соответствующим "\}" почему-то кажется очень асимметричной.
Что-то я упускаю или это ожидаемое изменение поведения от ST3?
Контрольный пример:
import org.stringtemplate.v4.ST;
public class ST4Test
{
public static void main(final String[] args)
{
final String[] env_vars = new String[]{"one", "two", "three"};
try
{
// This used to work in ST3, but fails in 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());
}
catch (Exception ex)
{
// The failing example results in a NPE
ex.printStackTrace();
}
// This works, but requires quoting the "}" contained within the anonymous
// template, which I find a bit disturbing, considering that I use ST for
// generating C-code, which tends to use the occasional "}", along with the
// fact that this used to work in 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());
}
}