Как вызвать speedMacro, хранящийся в шаблоне Velocity из Java - PullRequest
0 голосов
/ 18 октября 2011

Я хотел бы вызвать макрос, определенный в файле шаблона Velocity, из моего Java-приложения.

Например, я определил следующий макрос в файле шаблона с именем helloworld.vm:

#macro( print $msg $n )
#foreach( $i in [1..$n] )
Hello ${msg}!
#end
#end

И затем я хотел бы использовать скоростной двигатель для выполнения определенного макроса:

velocityEngine = new VelocityEngine();
velocityEngine.setProperty("resource.loader", "class");
velocityEngine.setProperty("class.resource.loader.class", ClassLoaderResourceLoader.class.getName());
velocityEngine.setProperty("class.resource.loader.classloader", this.classLoader);
velocityEngine.setProperty("class.resource.loader.location", "PATH_TO_TEMPLATE_DIRECTORY");
velocityEngine.init();

velocityContext = new VelocityContext();
StringWriter sw = new StringWriter();

velocityContext.put("msg", "Tom");
velocityContext.put("n", 2);
velocityEngine.invokeVelocimacro("print", "print", new String[]{"msg","n"}, velocityContext, sw);

Который я бы ожидал накормить sw чем-то вроде:

Hello Tom!
Hello Tom!

Но скорее выдает следующую ошибку:

RuntimeInstance.invokeVelocimacro() : VM 'print' is not registered.

Следовательно, какова процедура регистрации speedMacro или есть ли другой способ вызова макроса Velocity, сохраненного в файле пользовательского шаблона из Java?

1 Ответ

0 голосов
/ 18 октября 2011

Полагаю, вам нужно также указать свойство resource.loader=class, чтобы Velocity могла использовать загрузчик на основе classloader.

См. ClasspathResourceLoader javadocs .

Кроме того, действительно ли этот файл шаблона находится в пути к классам?

...