如何内省自由标记模板以找出它使用的变量?

2022-09-02 01:54:52

我完全不确定这是否是一个可以解决的问题,但是假设我有一个freemarker模板,我希望能够询问模板它使用哪些变量。

出于我的目的,我们可以假设freemarker模板非常简单 - 只是“根级”条目(这种模板的模型可以是一个简单的Map)。换句话说,我不需要处理调用嵌套结构等的模板。


答案 1

从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);
    }
}

答案 2

这可能已经很晚了,但是如果其他人遇到这个问题:您可以使用“data_model”和“globals”来检查模型 - data_model将仅包含模型提供的值,而全局变量还将包含模板中定义的任何变量。您需要在特殊变量前面加上一个点 - 因此要访问全局变量,请使用 ${.globals}

有关其他特殊变量,请参见 http://freemarker.sourceforge.net/docs/ref_specvar.html


推荐