Class PraxisMetadataAutoConfiguration
⚙️ Auto-Configuração Principal do Praxis Metadata Starter
Esta classe é responsável por configurar os aspectos estruturais e de integração do sistema Praxis Metadata, incluindo escaneamento de componentes, customizações OpenAPI e grupos de documentação de infraestrutura.
🎯 Objetivos Principais
- Component Scanning: Detecta e registra automaticamente todos os componentes do framework
- OpenAPI Integration: Configura customizações específicas para melhor documentação
- Infrastructure Groups: Cria grupos básicos de documentação para infraestrutura
- Type Mapping: Configura mapeamento correto de tipos Java para schemas OpenAPI
🔄 Diferença das Outras Auto-Configurações
| Configuração | Responsabilidade | Foco |
|---|---|---|
| PraxisMetadataAutoConfiguration | Estrutura base + Component Scan | 🏗️ Infraestrutura |
| OpenApiUiSchemaAutoConfiguration | Beans específicos do UI Schema | 🎨 Funcionalidade |
| DynamicSwaggerConfig | Grupos dinâmicos + Validação | 🤖 Automação |
📦 Component Scanning Strategy
Esta classe usa @ComponentScan para detectar automaticamente:
- org.praxisplatform.uischema.controller.docs: Controllers de documentação
- org.praxisplatform.uischema.service: Serviços base e metadados
- org.praxisplatform.uischema.filter: Filtros e specifications
- org.praxisplatform.uischema.configuration: Configurações adicionais
🔧 Fluxo de Inicialização
Spring Boot Auto-Configuration Detection
↓
PraxisMetadataAutoConfiguration
↓
@ComponentScan escaneia packages
↓
Registra: Controllers, Services, Filters, Configs
↓
OpenAPI Customizers aplicados
↓
Grupos de infraestrutura criados
↓
Sistema pronto para DynamicSwaggerConfig
🎯 Integração Sistêmica
Esta auto-configuração é a "fundação" que permite que outras funcionalidades funcionem:
- DynamicSwaggerConfig: Depende do component scan para ser detectado
- ApiDocsController: Registrado via component scan
- Services e Utilidades: Serviços base detectados automaticamente
- Resource controllers: Classes base canônicas e legadas disponibilizadas para heranca
⚡ Ordem de Execução
- 1º: PraxisMetadataAutoConfiguration (fundação + component scan)
- 2º: OpenApiUiSchemaAutoConfiguration (beans específicos)
- 3º: DynamicSwaggerConfig (detectado via component scan, roda via @PostConstruct)
- 4º: Validação (executada via @EventListener após startup completo)
- Since:
- 1.0.0
- See Also:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionorg.springdoc.core.customizers.OpenApiCustomizer🔢 Bean OpenApiCustomizer para BigDecimalorg.springdoc.core.models.GroupedOpenApi🌐 Bean GroupedOpenApi para Aplicação Geralorg.springdoc.core.models.GroupedOpenApi🏗️ Bean GroupedOpenApi para Infraestrutura do Praxisorg.springdoc.core.customizers.GlobalOpenApiCustomizer
-
Constructor Details
-
PraxisMetadataAutoConfiguration
public PraxisMetadataAutoConfiguration()
-
-
Method Details
-
bigDecimalOpenApiCustomizer
@Bean public org.springdoc.core.customizers.OpenApiCustomizer bigDecimalOpenApiCustomizer()🔢 Bean OpenApiCustomizer para BigDecimal
Configura o mapeamento correto de
BigDecimalpara schemas OpenAPI, garantindo que valores decimais sejam documentados adequadamente na API.🎯 Problema Resolvido:
Por padrão, SpringDoc pode mapear
BigDecimalde forma inconsistente. Este customizer força o mapeamento correto para o tipo "number" com formato "decimal".📋 Mapeamento Aplicado:
// Antes (inconsistente): BigDecimal → pode ser "string", "number", ou indefinido // Depois (consistente): BigDecimal → "number" com format "decimal"
🔄 Exemplo de Schema Gerado:
// Campo Java: @Schema(description = "Valor do salário") private BigDecimal salario; // Schema OpenAPI resultante: { "salario": { "type": "number", "format": "decimal", "description": "Valor do salário" } }🎯 Benefícios:
- Consistência: Todos os BigDecimal mapeados igualmente
- Precisão: Frontend sabe como tratar valores decimais
- Validação: Schemas corretos para validação de entrada
- Documentação: API docs mostram tipos precisos
🔗 Uso em DTOs:
public class FuncionarioDTO { // Automaticamente mapeado como "number"/"decimal": private BigDecimal salario; private BigDecimal bonus; private BigDecimal desconto; } // Frontend JavaScript pode tratar adequadamente: const salario = parseFloat(response.salario); // Não precisa converter de string⚙️ Configuração Técnica:
Utiliza
SpringDocUtils.getConfig().replaceWithSchema()para aplicar o mapeamento globalmente a todas as ocorrências deBigDecimalna aplicação.- Returns:
- OpenApiCustomizer que configura mapeamento de BigDecimal
-
restApiResourceComponentCustomizer
@Bean public org.springdoc.core.customizers.GlobalOpenApiCustomizer restApiResourceComponentCustomizer() -
praxisMetadataInfraOpenApi
@Bean public org.springdoc.core.models.GroupedOpenApi praxisMetadataInfraOpenApi()🏗️ Bean GroupedOpenApi para Infraestrutura do Praxis
Cria um grupo OpenAPI específico para endpoints de infraestrutura do sistema Praxis Metadata, separando a documentação interna dos endpoints de aplicação.
🎯 Objetivo:
Organizar a documentação OpenAPI separando endpoints internos do framework (infraestrutura) dos endpoints específicos da aplicação do usuário.
📡 Endpoints Incluídos:
- /schemas/filtered: Resolução automática de schemas por path
- /schemas/catalog: Catálogo resumido de domínios e superfícies publicadas
- Outros endpoints futuros em /schemas/*: somente quando realmente implementados pelo starter
🔄 Padrão de Matching:
pathsToMatch("/schemas/**") ✅ Incluídos: /schemas/filtered?path=/api/funcionarios /schemas/catalog ❌ Excluídos: /api/funcionarios (aplicação) /api/departamentos (aplicação) /health (outros sistemas)🎪 Benefícios da Separação:
- Organização: Documentação interna separada da aplicação
- Clareza: Desenvolvedores veem APIs do framework vs. negócio
- Manutenção: Mudanças internas não poluem docs da aplicação
- Versionamento: Infraestrutura pode ter ciclo diferente da aplicação
📋 Uso no Swagger UI:
Swagger UI Dropdown: ├── praxis-metadata-infra (este grupo) │ └── Endpoints: /schemas/filtered, /schemas/{group} ├── application (próximo bean) │ └── Endpoints: /api/funcionarios, /api/departamentos └── api-human-resources-funcionarios (grupos dinâmicos) └── Endpoints: /api/human-resources/funcionarios/**🔗 Integração:
Este grupo é consumido pelo
OpenApiGroupResolverjunto com outros grupos, mas tem prioridade diferente por ser específico de infraestrutura.⚡ Performance:
Documento pequeno (~2-5KB) focado apenas nos endpoints de infraestrutura, carregamento rápido para desenvolvedores que querem entender a API interna do framework.
- Returns:
- GroupedOpenApi configurado para endpoints de infraestrutura Praxis
-
praxisMetadataApplicationOpenApi
@Bean public org.springdoc.core.models.GroupedOpenApi praxisMetadataApplicationOpenApi()🌐 Bean GroupedOpenApi para Aplicação Geral
Cria um grupo OpenAPI "fallback" que captura todos os endpoints da aplicação que não são específicos de infraestrutura nem foram capturados por grupos dinâmicos mais específicos.
🎯 Objetivo:
Fornecer um grupo de documentação "catch-all" para endpoints que não se encaixam em grupos mais específicos, garantindo que nenhuma API fique sem documentação.
📡 Endpoints Incluídos:
pathsToMatch("/**") // Inclui TODOS os paths pathsToExclude("/schemas/**") // EXCETO infraestrutura ✅ Resultado - Incluídos: /api/funcionarios/** (se não tiver grupo dinâmico mais específico) /api/departamentos/** (se não tiver grupo dinâmico mais específico) /health (endpoints de sistema) /actuator/** (se habilitado) /api/custom/** (endpoints customizados) ❌ Excluídos: /schemas/** (grupo praxis-metadata-infra)🔄 Hierarquia de Grupos (Ordem de Prioridade):
- Grupos Dinâmicos: Criados pelo DynamicSwaggerConfig (mais específicos)
- Infraestrutura: praxis-metadata-infra (/schemas/**)
- Application: Este grupo (fallback geral)
📋 Cenários de Uso:
Cenário 1 - Controller com
@ApiResource:@ApiResource("/api/funcionarios")→ DynamicSwaggerConfig cria grupo específico → NÃO aparece no grupo "application" Cenário 2 - Controller sem@ApiResource:@RestController @RequestMapping("/api/legacy")→ NÃO tem grupo específico criado → APARECE no grupo "application" Cenário 3 - Endpoints de sistema: /health, /actuator/info → APARECE no grupo "application"🎪 Benefícios:
- Cobertura Total: Nenhum endpoint fica sem documentação
- Fallback Seguro: Endpoints legados ainda são documentados
- Debugging: Facilita identificar endpoints não organizados
- Migração Gradual: Permite transição suave para @ApiResource
⚠️ Indicador de Migração:
Se endpoints de negócio aparecem neste grupo em vez de grupos específicos, é um indicador de que o controller precisa migrar para usar @ApiResource:
// ❌ Aparece no grupo "application": @RestController @RequestMapping("/api/funcionarios") // ✅ Tem grupo próprio "api-funcionarios": @ApiResource("/api/funcionarios")📊 Exemplo no Swagger UI:
Dropdown Swagger UI: ├── api-human-resources-funcionarios (específico) ├── api-human-resources-departamentos (específico) ├── praxis-metadata-infra (infraestrutura) └── application (este grupo - fallback) ├── /health ├── /actuator/info └── /api/legacy/** (controllers não migrados)🔗 Integração com Resolução Automática:
O OpenApiGroupResolver também considera este grupo, mas com menor prioridade que grupos mais específicos, garantindo que a resolução automática funcione corretamente.
- Returns:
- GroupedOpenApi configurado como fallback para todos os endpoints da aplicação
-