列出 Thymeleaf 中所有可用的模型属性

2022-09-02 04:56:28

出于调试目的,我想列出我的百里香叶模板在渲染时可用的所有模型属性。

像这样:

<table>
    <tr th:each="model : ${*}">
        <td th:text="${model}"></td>
    </tr>
</table>

但显然这是无稽之谈,我得到了一个当之无愧的错误。(org.springframework.expression.spel.SpelParseException: EL1070E:(pos 0): Problem parsing left operand)

有没有办法输出这样的调试信息?我甚至会满足于一些日志记录输出。

或者,Thymeleaf是否提供了类似于Struts 2的东西,它在页面底部添加了一个调试部分,列出了所有可用的属性?struts.devMode


答案 1

试试这个:

<table>
    <tr th:each="var : ${#vars}">
        <td th:text="${var.key}"></td>
        <td th:text="${var.value}"></td>
    </tr>
</table>

答案 2

接受的答案似乎不适用于Thymeleaf 3;这是一个更新。请注意,我正在使用弹簧;这可能不适用于非春季应用。

<table>
    <tr th:each="var : ${#vars.getVariableNames()}">
        <td th:text="${var}"></td>
        <td th:text="${#vars.getVariable(var)}"></td>
    </tr>
    <!-- 
        Adding these manually because they are considered special.
        see https://github.com/thymeleaf/thymeleaf/blob/thymeleaf-3.0.3.RELEASE/src/main/java/org/thymeleaf/context/WebEngineContext.java#L199
    -->
    <tr>
        <td>param</td>
        <td th:text="${#vars.getVariable('param')}"></td>
    </tr>
    <tr>
        <td>session</td>
        <td th:text="${#vars.getVariable('session')}"></td>
    </tr>
    <tr>
        <td>application</td>
        <td th:text="${#vars.getVariable('application')}"></td>
    </tr>
</table>

也就是说,我所做的是创建了一个独立的Bean,它使事情变得更漂亮,并转储到日志而不是HTML:

@Component
public class ThymeleafDumper {

    private Logger log = LoggerFactory.getLogger(ThymeleafDumper.class);

    public void dumpToLog(WebEngineContext ctx) {
        log.debug("Thymeleaf context: {}", formatThisUpNicely(ctx));
    }

    // ... etc
}

哪里可以使用,把结果放到一个,导出到,随便什么。不要忘记这三个“特殊”变量!formatThisUpNicelyctx.getVariableNames()SortedMapjson

然后将其的实例公开为 a 或 :@ModelAttributeControllerControllerAdvice

@ControllerAdvice
public class SomeControllerAdvice {

    @Autowired
    private ThymeleafDumper thymeleafDumper;

    @ModelAttribute("dumper")
    public ThymeleafDumper dumper() {
        return this.thymeleafDumper;
    }
}

然后在我的模板中运行:

<div th:text="${dumper.dumpToLog(#vars)}"/>

推荐