如何内省自由标记模板以找出它使用的变量?
2022-09-02 01:54:52
我完全不确定这是否是一个可以解决的问题,但是假设我有一个freemarker模板,我希望能够询问模板它使用哪些变量。
出于我的目的,我们可以假设freemarker模板非常简单 - 只是“根级”条目(这种模板的模型可以是一个简单的Map)。换句话说,我不需要处理调用嵌套结构等的模板。
我完全不确定这是否是一个可以解决的问题,但是假设我有一个freemarker模板,我希望能够询问模板它使用哪些变量。
出于我的目的,我们可以假设freemarker模板非常简单 - 只是“根级”条目(这种模板的模型可以是一个简单的Map)。换句话说,我不需要处理调用嵌套结构等的模板。
从java获取变量的另一种方法。这只是尝试处理模板并捕获以查找自由标记模板中的所有变量InvalidReferenceException
/**
* Find all the variables used in the Freemarker Template
* @param templateName
* @return
*/
public Set<String> getTemplateVariables(String templateName) {
Template template = getTemplate(templateName);
StringWriter stringWriter = new StringWriter();
Map<String, Object> dataModel = new HashMap<>();
boolean exceptionCaught;
do {
exceptionCaught = false;
try {
template.process(dataModel, stringWriter);
} catch (InvalidReferenceException e) {
exceptionCaught = true;
dataModel.put(e.getBlamedExpressionString(), "");
} catch (IOException | TemplateException e) {
throw new IllegalStateException("Failed to Load Template: " + templateName, e);
}
} while (exceptionCaught);
return dataModel.keySet();
}
private Template getTemplate(String templateName) {
try {
return configuration.getTemplate(templateName);
} catch (IOException e) {
throw new IllegalStateException("Failed to Load Template: " + templateName, e);
}
}
这可能已经很晚了,但是如果其他人遇到这个问题:您可以使用“data_model”和“globals”来检查模型 - data_model将仅包含模型提供的值,而全局变量还将包含模板中定义的任何变量。您需要在特殊变量前面加上一个点 - 因此要访问全局变量,请使用 ${.globals}
有关其他特殊变量,请参见 http://freemarker.sourceforge.net/docs/ref_specvar.html