Pular para conteúdo

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.gradle 3.2.4 casado ao runtime micronaut-views-jte; templates em src/main/jte/** (login.jte, kit/, processamentos/, compras/, admin/), generateJte antes do compileJava.

    Correção 2026-09-10: o login.jte local 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 .java gerados são compilados junto do app (native-safe; sem .bin por reflexão em runtime). contentType = Html.
  • reflect-config.json de reachability-metadata dos templates gerados em src/main/resources/META-INF/native-image/jte-views/.
  • Checkstyle exclui **/gg/jte/generated/** (código gerado, não humano).
  • CSRF (_csrf) nos forms POST via CsrfTokens da lib xadm-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).