Я искал способ получить список всех ключей, используемых в шаблоне Velocity. Как уже упоминалось в одном из комментариев, вы можете реализовать свой собственный посетитель для запуска всех узлов в шаблоне Velocity.
Вот фрагмент, который хранит ключи, которые встречаются в шаблоне и печатает их потом:
VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
props.put("resource.loader", "class");
ve.init(props);
Template t = ve.getTemplate("templates/my-template.vm");
final List<String> keys = new ArrayList<String>();
SimpleNode sn = (SimpleNode)t.getData();
BaseVisitor myVisitor = new BaseVisitor(){
@Override
public Object visit(ASTReference node, Object data){
String key = node.literal();
keys.add(key);
return super.visit(node, data);
}
};
sn.jjtAccept(myVisitor, new Object());
for (String key : keys) {
System.out.println(key);
}
Например, если ваш шаблон Velocity имеет следующее содержание:
<p>Dear ${user.name}, the ordered package has been sent to ${user.address}.</p>
Ниже будет печатаются:
${user.name}
${user.address}
Я сделал это, но на данный момент у вас нет источника. Я думаю, что в итоге я использовал посетителей, но не могу вспомнить специфику. –
Вы * можете * реализовать собственный 'Context', который добавляет ключи вызовов' containsKey' или 'get' к' Set' и использует его вместе с 'NullWriter' (commons-io) на этапе предварительной обработки. Кроме того, это как-то плохо, это также страдает от теоретического дефицита, который никто не гарантирует * (хотя он должен работать, я думаю), что Velocity будет ссылаться на любой из двух методов, потому что он не находит никаких ключей, появляющихся в 'getKeys () '. –
misberner