Java ApacheVelocity:有没有标准的方法从命令行验证模板的正确性?
我们的网站使用模板语言。我们的内容管理系统已经检查所有生成的XML文档是否格式良好。我们被要求在将文件推送到实时站点之前检查文档以捕获Velocity语法错误 是否有从命令行验证Velocity模板正确性的标准方法? 我准备读入模板路径,初始化Velocity引擎,解析模板,并捕获任何错误,但是如果有现成的工具可以获取文件和配置,并吐出任何错误,那么我宁愿使用它Java ApacheVelocity:有没有标准的方法从命令行验证模板的正确性?,java,apache,velocity,Java,Apache,Velocity,我们的网站使用模板语言。我们的内容管理系统已经检查所有生成的XML文档是否格式良好。我们被要求在将文件推送到实时站点之前检查文档以捕获Velocity语法错误 是否有从命令行验证Velocity模板正确性的标准方法? 我准备读入模板路径,初始化Velocity引擎,解析模板,并捕获任何错误,但是如果有现成的工具可以获取文件和配置,并吐出任何错误,那么我宁愿使用它 更新 下面是我最后做的: package velocitysample; import java.io.IOException;
更新 下面是我最后做的:
package velocitysample;
import java.io.IOException;
import java.io.StringWriter;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
public class Main
{
/** Define a static logger variable so that it references the Logger
* instance named "MyApp".
*/
private static Logger logger = Logger.getLogger(Main.class);
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
/* Set up a simple log4j configuration that logs on the console. */
BasicConfigurator.configure();
/* Check to see that a template path was passed on the command line. */
if (args.length != 1)
{
logger.fatal("You must pass the path to a template as a " +
"command line argument.");
return;
}
/* Pull the template filename from the command line argument. */
String fileName = args[0];
try
{
Velocity.setProperty("resource.loader", "file");
Velocity.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
Velocity.setProperty("file.resource.loader.path", "/templates/");
Velocity.setProperty("file.resource.loader.cache", "false");
Velocity.setProperty("file.resource.loader.modificationCheckInterval", "0");
Velocity.init();
}
catch (Exception ex)
{
logger.fatal("Error initializing the Veolcity engine.", ex);
return;
}
boolean error = false;
/* Create an empty Velocity context */
VelocityContext context = new VelocityContext();
Template template = null;
try
{
template = Velocity.getTemplate(fileName);
}
catch( ResourceNotFoundException rnfe )
{
logger.error("Couldn't find the template to parse at this path: " +
fileName + ".", rnfe);
error = true;
}
catch( ParseErrorException peex )
{
logger.error("Error parsing the template located at this path: " +
fileName + ".", peex);
error = true;
}
catch( MethodInvocationException mie )
{
logger.error("Something invoked in the template (" + fileName +
") threw an Exception while parsing.", mie);
error = true;
}
catch( Exception e )
{
logger.error("An unexpected exception was thrown when attempting " +
"to parse the template: " + fileName + ".", e);
error = true;
}
if (error)
{
return;
}
StringWriter sw = new StringWriter();
try
{
template.merge(context, sw);
}
catch (ResourceNotFoundException rnfe)
{
logger.error("Couldn't find the template to merge at this path: " +
fileName + ".", rnfe);
error = true;
}
catch (ParseErrorException peex)
{
logger.error("Error parsing the template at this path during merge: " +
fileName + ".", peex);
error = true;
}
catch (MethodInvocationException mie)
{
logger.error("Something invoked in the template (" + fileName +
") threw an Exception while merging.", mie);
error = true;
}
catch (IOException ioe)
{
logger.error("Error reading the template located at this path from " +
"disk: " + fileName + ".", ioe);
error = true;
}
catch( Exception e )
{
logger.error("An unexpected exception was thrown when attempting " +
"to merge the template: " + fileName + ".", e);
error = true;
}
if (!error)
{
logger.info("No syntax errors detected.");
}
}
}
有一个与Velocity一起分发的工具,名为TemplateTool,它转储所有引用,并可用于验证模板的语法
但是,必须正确设置上下文才能验证任何模板。因此,最好的验证方法是使用自己的上下文编写自己的工具。要捕获Velocity语法错误,您的方法可能是最好的
但是,它将忽略无效的宏参数和不存在的引用。在Velocity 1.6中,您可以设置一个严格模式,该模式将对错误的宏参数(例如错误的数字)或错误的引用(例如$abc.badMethod())引发异常。这假设您正在填充测试工具中使用的模板的上下文,就像在生产中使用模板一样。2010年12月,有人发布了一个用于验证Velocity的工具。我试过了,效果很好。它使用的是Velocity 1.6.4,但如果需要,也可以换成其他版本
感谢您对解决方案的描述-我很快就会做类似的事情