0022 — 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 bi-comercial (login, processamentos, admin, import de XLS) rodavam em
Thymeleaf (micronaut-views-thymeleaf). Sob GraalVM native-image (decisão
0021) o Thymeleaf/OGNL resolve o modelo por reflexão — cada
tipo alcançado por template exigiria @ReflectiveAccess e a falha aparece só em runtime
(500), tela por tela: 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¶
- Plugin
gg.jte.gradle3.2.4 casado ao runtimemicronaut-views-jte; templates emsrc/main/jte/**(login.jte,kit/,processamentos/,compras/,admin/),generateJteantes docompileJava.Correção 2026-09-10: o
login.jtelocal foi apagado na adoção da login servida pela lib (decisão 0025) — a lista acima era o estado da migração JTE, não o atual. generate()mode — os.javagerados são compilados junto do app (native-safe; sem.binpor reflexão em runtime).contentType = Html.reflect-config.jsonde reachability-metadata dos templates gerados emsrc/main/resources/META-INF/native-image/jte-views/.- Checkstyle exclui
**/gg/jte/generated/**(código gerado, não humano). - CSRF (
_csrf) nos forms POST viaCsrfTokensda libxadm-seguranca(decisão 0018), agora consumido a partir dos templates JTE.
Fora de escopo: o motivo e as alternativas da migração (vivem na central 0025).