2015-07-13 8 views
9

Per scopi di debug, desidero elencare gli attributi di modello tutti disponibili per il mio modello di thymeaf mentre è in fase di rendering.Elencare tutti gli attributi di modello disponibili in Thymeleaf

Qualcosa di simile:

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

Ma, ovviamente, che è una sciocchezza, e ottengo un errore meritato. (org.springframework.expression.spel.SpelParseException: EL1070E:(pos 0): Problem parsing left operand)

Esiste un modo per emettere tali informazioni di debug? Mi accontenterei anche di qualche uscita di registrazione.

Oppure, Thymeleaf fornisce qualcosa di simile a struts.devMode di Struts 2 dove ha aggiunto una sezione di debug nella parte inferiore della pagina che elenca tutte le proprietà disponibili?

risposta

26

Prova questo:

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

Fantastico - questo in realtà dà ancora più di quello che volevo: include tutti i bean a molla disponibili per le viste, non solo i modelli che ho inserito. Informazioni molto utili! –

+0

@ the4dK sei un risparmiatore di vita! – Ali

2

Queste sono tutte le configurazioni disponibili: registrazione

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 

questi registrerà tutte le azioni thymeleaf. Spero sia utile.

+0

Ma attenzione, gli utenti di avvio di primavera! http://izeye.blogspot.com/2015/02/enable-orgthymeleaf-trace-log-in-spring.html –

6

La risposta accettata non sembra funzionare per Thymeleaf 3; ecco un aggiornamento. Si prega di notare che sto usando Spring; questo potrebbe non funzionare per le app non 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> 

Detto questo, quello che ho fatto è stato creato un Bean standalone che rende le cose un po 'più bella e discariche ai log anziché in HTML:

@Component 
public class ThymeleafDumper { 

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

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

    // ... etc 
} 

Dove formatThisUpNicely può usare ctx.getVariableNames(), mettere il risultati in un SortedMap, esportare in json, qualunque sia. Non dimenticare quelle tre variabili "speciali"!

Poi esporre un'istanza di esso come un @ModelAttribute in un Controller o un ControllerAdvice:

@ControllerAdvice 
public class SomeControllerAdvice { 

    @Autowired 
    private ThymeleafDumper thymeleafDumper; 

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

Poi nel mio modello di esecuzione:

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