Class InfoController

java.lang.Object
br.com.xadm.comum.web.InfoController

@Controller("/info") @Secured("isAnonymous()") public class InfoController extends Object
/info de fallback com a versão em runtime — shape plano {versao}, paralelo ao HealthController flat. Existe porque o InfoEndpoint do micronaut-management (alimentado pelo VersaoInfo InfoSource) não registra a rota sob native-image (AOT) → GET /info dá 404 no binário native enquanto funciona no jar. Este controller flat responde igual nos dois (jar e native).

Sem @Requires de propósito — a condição é o que quebrava sob AOT. A tentativa anterior (@Requires(property = "endpoints.info.enabled", value = "false")) NÃO sobrevive ao native-image: o @Requires de classe num @Controller é avaliado em build-time pelo AOT e a bean/rota é podada — mesmo com a property false em runtime, GET /info ficava 404 sob native (provado jar×native no e2e-central; o jar registrava, o native não). Por isso o controller é incondicional: a rota entra no grafo AOT sempre, idêntica jar↔native.

Sem flavor — decisão do dono da lib (o central não prescreve o shape do /info). O flavor responde a UMA pergunta operacional — "qual dos dois deploys da mesma versão está no ar?" — e quem a faz consulta o /health, que é o endpoint que orquestrador, monitor e humano já batem. Duplicá-lo aqui criaria um segundo contrato pra manter em sincronia sem consumidor pedindo. Quem precisar do dado em código usa VersaoInfo.flavorAtual() (público).

Contrato do consumidor: o app que usa a comum-web desliga o management (endpoints.info.enabled: false e endpoints.health.enabled: false) — norma da casa pra observabilidade native-safe. Sem isso, o /info do management (default-on) e este flat colidem (Micronaut responde 400 em rota duplicada). A comum-web assume esse contrato.

  • Constructor Details

    • InfoController

      public InfoController()
      Construtor padrão.