Você é um especialista em Spring Boot e arquitetura de APIs REST. Sua tarefa é implementar um filtro HTTP que adicione automaticamente o header "x-Api-Version" em todas as respostas HTTP da aplicação, contendo a versão do projeto obtida do BuildProperties do Spring Boot.
CONTEXTO DO PROJETO:
- Projeto Spring Boot (versão 2.x ou 3.x)
- Build tool: Maven
- Java 11 ou superior
- Arquitetura: seguir padrões do projeto existente
OBJETIVO: Criar um filtro HTTP que intercepte todas as requisições e adicione o header "x-Api-Version" na resposta, contendo a versão do projeto definida no pom.xml.
REQUISITOS TÉCNICOS:
-
CONFIGURAÇÃO DO MAVEN:
- Configurar o plugin spring-boot-maven-plugin com o goal "build-info" para gerar BuildProperties automaticamente
- A versão deve ser obtida da tag do pom.xml
-
ESTRUTURA DE CÓDIGO:
- Criar classe VersionHeaderFilter no pacote config
- A classe deve estender OncePerRequestFilter do Spring
- Deve ser anotada com @Component para registro automático
- Deve injetar BuildProperties via construtor
- Deve adicionar o header "x-Api-Version" em todas as respostas HTTP
-
CONSTANTES:
- Criar ou atualizar classe Constants com a constante X_API_VERSION = "x-Api-Version"
- Usar a constante no filtro ao invés de string hardcoded
-
COMPATIBILIDADE:
- Se Spring Boot 2.x: usar javax.servlet.*
- Se Spring Boot 3.x: usar jakarta.servlet.*
- Detectar automaticamente a versão do Spring Boot do projeto
-
TESTES:
- Criar teste unitário para o VersionHeaderFilter
- Testar que o header é adicionado corretamente
- Testar que o valor do header corresponde à versão do BuildProperties
- Usar Mockito para mocks
INSTRUÇÕES DE IMPLEMENTAÇÃO:
-
Analisar o pom.xml do projeto:
- Verificar se spring-boot-maven-plugin está configurado
- Adicionar/atualizar configuração do plugin com goal build-info
- Verificar se a tag está definida
-
Verificar estrutura de pacotes:
- Identificar onde ficam as classes de configuração (geralmente em config/)
- Identificar onde ficam as constantes (geralmente em util/ ou domain/util/)
-
Criar/atualizar Constants:
- Adicionar constante X_API_VERSION se não existir
- Manter padrão de nomenclatura do projeto
-
Criar VersionHeaderFilter:
- Localização: src/main/java/[pacote]/config/VersionHeaderFilter.java
- Implementar doFilterInternal adicionando o header na resposta
- Garantir que o filtro não bloqueia o fluxo (chamar filterChain.doFilter)
-
Criar teste unitário:
- Localização: src/test/java/[pacote]/config/VersionHeaderFilterTest.java
- Usar @ExtendWith(MockitoExtension.class)
- Mockar BuildProperties, HttpServletRequest, HttpServletResponse e FilterChain
- Verificar que addHeader foi chamado com os parâmetros corretos
VALIDAÇÃO:
- O filtro deve ser registrado automaticamente pelo Spring (via @Component)
- O header deve aparecer em TODAS as respostas HTTP (sucesso, erro, etc.)
- O valor do header deve corresponder à versão do pom.xml
- O código deve seguir os padrões e convenções do projeto existente
- Os testes devem passar
ENTREGÁVEIS:
- Atualização do pom.xml (se necessário)
- Classe Constants atualizada ou criada
- Classe VersionHeaderFilter implementada
- Classe VersionHeaderFilterTest implementada
- Instruções de como testar manualmente
IMPORTANTE:
- Não modificar código existente desnecessariamente
- Seguir padrões de nomenclatura e estrutura do projeto
- Garantir que não há breaking changes
- Documentar qualquer decisão arquitetural importante