Class DynamicSwaggerConfig
🎯 Configuração Dinâmica de Grupos OpenAPI com Estratégia Dupla
Cria automaticamente grupos OpenAPI otimizados para performance usando uma estratégia dupla: Grupos Individuais Ultra-Específicos para CRUDs + Grupos Agregados por Contexto via @ApiGroup.
🎯 Problema Resolvido
Antes desta implementação, era necessário registrar grupos OpenAPI manualmente e especificar parâmetros 'document' no ApiDocsController. Esta classe resolve automaticamente ambos os problemas com performance otimizada.
🚀 Estratégia Dupla de Grupos
📊 1. Grupos Individuais Ultra-Específicos
- Escopo: Controllers do legado
AbstractCrudControllere da nova hierarquiaAbstractResourceQueryController - Performance: ~3-5KB por documento (ultra-rápido)
- Uso: Consultas específicas como
/schemas/filtered?path=/api/human-resources/eventos-folha/all
🏷️ 2. Grupos Agregados por Contexto
- Escopo: QUALQUER controller com anotação
@ApiGroup - Performance: ~50-100KB por documento (ainda otimizado)
- Uso: Visualização de contextos completos no Swagger UI
🔄 Fluxo de Funcionamento
- Startup da Aplicação: @PostConstruct é executado automaticamente
- Escaneamento Dual:
- 1ª passada: Identifica controllers resource-oriented canônicos para grupos individuais
- 2ª passada: Identifica QUALQUER controller com
@ApiGrouppara grupos agregados
- Extração de Paths: Usa
AnnotationUtilspara detectar @ApiResource/@RequestMapping - Registro Inteligente: Evita duplicação de beans e otimiza padrões agregados
📋 Exemplos de Uso
// ✅ CRUD Controller - Cria grupo individual + participa do agregado
@ApiResource("/api/human-resources/funcionarios")
@ApiGroup("human-resources")
public class FuncionarioController extends AbstractCrudController<...> {
// Grupo individual: "api-human-resources-funcionarios" (ultra-específico)
// Grupo agregado: "recursos-humanos" (contexto completo)
}
// ✅ Bulk Controller - Apenas participa do grupo agregado
@ApiResource("/api/human-resources/funcionarios")
@ApiGroup("human-resources-bulk")
public class FuncionarioBulkController extends AbstractBulkController<...> {
// Grupo agregado: "recursos-humanos-bulk" (contexto bulk)
}
// ✅ Qualquer Controller - Participa apenas do grupo agregado
@RestController
@RequestMapping("/api/custom/reports")
@ApiGroup("relatorios")
public class CustomReportController {
// Grupo agregado: "relatorios" (contexto customizado)
}
📊 Resultado Típico
Para uma aplicação com 8 controllers CRUD e 8 controllers Bulk:
📋 Grupos Individuais (8): ├── api-human-resources-funcionarios (3KB - ultra-rápido) ├── api-human-resources-cargos (3KB - ultra-rápido) ├── api-human-resources-departamentos (3KB - ultra-rápido) └── ... (5 mais) 🏷️ Grupos Agregados (2): ├── recursos-humanos (50KB - 8 controllers CRUD) └── recursos-humanos-bulk (30KB - 8 controllers Bulk) 📈 Total: 10 grupos vs documento completo (500KB+)
🚀 Benefícios
- Performance Extrema: Grupos individuais ~99% menores que documento completo
- Flexibilidade Total: Qualquer controller pode participar de contextos via @ApiGroup
- Semântica Clara: Grupos individuais para CRUDs, agregados para contextos
- Zero Configuração: Detecção automática de anotações @ApiResource/@RequestMapping
- Integração Perfeita: ApiDocsController resolve grupos automaticamente
⚙️ Configuração Necessária
Esta classe deve estar incluída no @ComponentScan da PraxisMetadataAutoConfiguration:
@ComponentScan(basePackages = {"org.praxisplatform.uischema.configuration"})
- Since:
- 1.0.0
- See Also:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid🎯 Método Principal - Criação Dinâmica com Estratégia Duplavoid✅ Validação de Conformidade com @ApiResource
-
Constructor Details
-
DynamicSwaggerConfig
public DynamicSwaggerConfig()
-
-
Method Details
-
createDynamicGroups
@PostConstruct public void createDynamicGroups()🎯 Método Principal - Criação Dinâmica com Estratégia Dupla
Este método é executado automaticamente durante o startup da aplicação (@PostConstruct) e implementa a estratégia dupla de criação de grupos:
📊 1ª Passada - Grupos Individuais Ultra-Específicos:
- Escaneia controllers que estendem
AbstractCrudControllerouAbstractResourceQueryController - Cria grupos individuais baseados no path completo (ex: "api-human-resources-funcionarios")
- Performance ultra-otimizada: ~3-5KB por documento
🏷️ 2ª Passada - Grupos Agregados por Contexto:
- Escaneia TODOS os controllers em busca de anotação
@ApiGroup - Agrupa controllers por contexto de negócio (ex: "recursos-humanos", "recursos-humanos-bulk")
- Calcula padrões agregados inteligentes que englobam múltiplos paths
📊 Exemplo de Saída no Log:
Total de handlers encontrados: 247 Controllers qualificados para grupos individuais canônicos: 8 Grupo individual 'api-human-resources-funcionarios' registrado para FuncionarioController Grupo individual 'api-human-resources-cargos' registrado para CargoController ... (6 mais grupos individuais) Grupo agregado 'recursos-humanos' registrado com 8 controller(s) (pattern: /api/human-resources) Grupo agregado 'recursos-humanos-bulk' registrado com 8 controller(s) (pattern: /api/human-resources) Total: 10 grupos (8 individuais + 2 agregados)
🚀 Performance Resultante:
- Consultas específicas: 3-5KB (grupos individuais)
- Contextos de negócio: 50-100KB (grupos agregados)
- Vs documento completo: 500KB+ (90-99% de economia)
- Escaneia controllers que estendem
-
validateApiResourceUsage
@EventListener(org.springframework.boot.context.event.ApplicationReadyEvent.class) public void validateApiResourceUsage()✅ Validação de Conformidade com @ApiResource
Executa após o startup completo da aplicação para validar se todos os controllers resource-oriented canônicos estão usando @ApiResource conforme esperado.
🎯 Objetivo:
Garantir que developers sigam o padrão arquitetural correto, evitando inconsistências e problemas de manutenção futuros. Força migração para @ApiResource para aproveitar os benefícios da resolução automática de grupos OpenAPI.
📋 Comportamentos:
- WARN: Emite warnings informativos no log (padrão)
- FAIL: Interrompe o startup com exceção
- IGNORE: Pula a validação completamente
⚠️ Sem Exceções:
Todos os controllers resource-oriented canônicos devem migrar para @ApiResource. Não há anotação de exceção ou contorno - a validação é direta e obrigatória.
-