0021 — Views em JTE no lugar de Thymeleaf¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-08-26 · Decidido em: 2026-08-26
Contexto. As telas server-render do integrador (estoque, fretes, fórmulas, itens de
pedido, contratos…) rodavam em Thymeleaf (micronaut-views-thymeleaf). Sob GraalVM
native-image (decisão 0020) o Thymeleaf/OGNL resolve todo acesso
a modelo por reflexão → cada tipo alcançado por um template exige @ReflectiveAccess, a falha
aparece em runtime (500), tela por tela, e o conjunto drifta a cada view nova. É
whack-a-mole de reflexão. A casa fixou o alvo na ADR central
0025 — Views server-render com JTE.
Decisão. Adotar JTE (gg.jte) como motor das views server-render, substituindo o Thymeleaf, seguindo a central 0025. Template compilado, type-check no build, zero reflexão de modelo em runtime.
Consequências (específicas do app).
- Plugin
gg.jte.gradle3.2.4 casado ao runtimemicronaut-views-jte; templates emsrc/main/jte/**,generateJteantes docompileJava. generate()mode — os.javasão emitidos embuild/generated-sources/jtee compilados junto do app (native-safe; sem.bincarregado por reflexão em runtime).contentType = Html(escape HTML por padrão).reflect-config.jsonde reachability-metadata dos templates gerados emsrc/main/resources/META-INF/native-image/jte-views/.- Checkstyle e JaCoCo excluem
**/gg/jte/generated/**(código gerado, não humano). - Composição de layout via
kit/JTE; os globais de view continuam noGlobalViewModellocal (br.com.xadm.comum).
Fora de escopo: o motivo e as alternativas da migração (vivem na central 0025).