Thymeleaf - passa variáveis ​​para fragmentos

Sep 21 2020

Eu tenho o seguinte modelo com fragmento para onde estou passando a variável:

<div th:fragment="main">
    <span>
        <th:block th:include=" :: inner(${item})" /> </span> <a> <th:block th:include=" :: inner(${item})" />
    </a>
</div>

<th:block th:fragment="inner(item)">
    [[${item.name}]]
</th:block>

Se tento renderizá-lo, obtenho um erro dizendo:

Property or field 'name' cannot be found on null

Se eu renderizar assim

<div th:fragment="main">
    <span>
        <th:block th:include=" :: inner(${item})" />
        [[${item.name}]] </span> <a> <th:block th:include=" :: inner(${item})" />
    </a>
</div>

O que estou fazendo de errado ao atribuir a variável ao fragmento?

Respostas

michal.jakubeczy Sep 21 2020 at 21:47

Descobri isso.

O motivo do erro foi que o fragmento 'interno' foi renderizado durante a renderização junto com o fragmento principal. Assim, junto com as inclusões, ele foi renderizado por si mesmo. E esta última renderização estragou tudo.

As soluções possíveis são:

  1. mova o fragmento interno para outro arquivo
  2. adicione th:if="false"ao fragmento 'interno' para evitar a auto-renderização (as inclusões continuarão a funcionar).