2015-07-13 5 views
9

Для целей отладки я хотел бы указать все атрибуты модели, доступные моему шаблону тимелеафа, в то время как это рендеринг.Список всех доступных атрибутов модели в Thymeleaf

Что-то вроде:

<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's struts.devMode, где он добавил раздел отладки в нижней части страницы со всеми доступными свойствами?

ответ

26

Попробуйте это:

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

Фантастический - это на самом деле дает еще больше, чем я хотел: включает в себя все весенние бобы, доступные для просмотров, не только модели, которые я вложил. Очень полезная информация! –

+0

@ the4dK вы спасатель жизни! – Ali

2

это все лесозаготовительные доступные конфигурации:

log4j.logger.org.thymeleaf=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.CONFIG=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.TIMER=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.cache.TEMPLATE_CACHE=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.cache.FRAGMENT_CACHE=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.cache.MESSAGE_CACHE=DEBUG 
log4j.logger.org.thymeleaf.TemplateEngine.cache.EXPRESSION_CACHE=DEBUG 

это будет регистрировать все действия thymeleaf. Надеюсь, это полезно.

+0

Но будьте осторожны, пользователи пружинных загрузок! http://izeye.blogspot.com/2015/02/enable-orgthymeleaf-trace-log-in-spring.html –

6

Принятый ответ не похож на работу для Thymeleaf 3; вот обновление. Обратите внимание, что я использую Spring; это может не работать для приложений, отличных от Spring.

<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're 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 
} 

formatThisUpNicely Где можно использовать ctx.getVariableNames(), положить результаты в SortedMap, экспорт в json, что угодно. Не забывайте эти три «специальные» переменные!

Затем выставить его экземпляр как @ModelAttribute в Controller или его ControllerAdvice:

@ControllerAdvice 
public class SomeControllerAdvice { 

    @Autowired 
    private ThymeleafDumper thymeleafDumper; 

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

Тогда в моем шаблоне перспективе:

<div th:text="${dumper.dumpToLog(#vars)}"/> 
Смежные вопросы