Pular para conteúdo

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.gradle 3.2.4 casado ao runtime micronaut-views-jte; templates em src/main/jte/**, generateJte antes do compileJava.
  • generate() mode — os .java são emitidos em build/generated-sources/jte e compilados junto do app (native-safe; sem .bin carregado por reflexão em runtime).
  • contentType = Html (escape HTML por padrão).
  • reflect-config.json de reachability-metadata dos templates gerados em src/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 no GlobalViewModel local (br.com.xadm.comum).

Fora de escopo: o motivo e as alternativas da migração (vivem na central 0025).