OpenAPI Generator
openapi-spec.El Problema con los Primary Adapters Manuales
A menos que trabajes en microservicios, un proyecto suele tener más que unos pocos endpoints. A medida que tu dominio crece, crear primary adapters manualmente se convierte en una tarea monumental. Viene con muchos inconvenientes:
- Consume mucho tiempo: Cada endpoint, cada modelo, todo a mano. Es una molestia.
- Propenso a errores humanos: Un typo, un campo olvidado, y de repente tu API no está haciendo lo que debería.
- Compromete la documentación y mantenibilidad: En el momento en que tu código se desvía de tu spec, tu documentación es una mentira, y tu mantenibilidad se va al tacho.
El proyecto SIGEM (un monolito Grails) presume 76 controladores y una asombrosa cantidad de 1102 endpoints.

Archivos involucrados
- Java
- Kotlin
- Groovy
Generando Código
Ahorrémosnos algunos problemas usando una de las mejores librerías que existen: openapi-generator.
- Java
- Kotlin
- Groovy
Podés encontrar más información sobre las diferentes configuraciones en la Documentación para el generador spring.
Podés encontrar más información sobre las diferentes configuraciones en la Documentación para el generador kotlin-spring.
- Podés encontrar más información sobre las diferentes configuraciones en la Documentación para el generador spring.
- Aunque existe un generador groovy, es un generador de clientes. Para nuestro caso de uso (generar código del lado del servidor), no es lo que necesitamos. Por eso nos quedamos con el generador "spring", que genera clases
.java.
inputspec debe estar apuntando al archivo YAML de OpenAPI Specification
deseado (src/main/resources/openapi.yaml).
Ahora que todo está configurado, ejecutá la tarea Build. Cuando la tarea termine, revisá la carpeta build\generated\sources\openapi. Vas a encontrar la representación de la OpenAPI Specification (nuestro contrato) en clases, listas para ser usadas.
Entendiendo el Código Generado
- ¿Qué hay adentro del código generado?
- Models: Clases Java (o Kotlin) que reflejan tus schemas de OpenAPI (ej.,
Film). Estas incluyen anotaciones de validación, lógica de serialización y patrones builder. - API Interfaces: Interfaces Spring
@RestController(ej.,FilmApi) que definen tus endpoints y sus firmas de métodos.
- Models: Clases Java (o Kotlin) que reflejan tus schemas de OpenAPI (ej.,
- ¿Por qué se ve tan complicado? El código generado incluye:
- Boilerplate para compatibilidad con OpenAPI/Spring (ej., anotaciones
@Validated,@Generated). - Lógica de validación (ej.,
@NotNull,@Size) para hacer cumplir tu contrato. - Soporte de serialización/deserialización (ej., mapeo JSON ↔ objeto Java (o Kotlin)).
- Boilerplate para compatibilidad con OpenAPI/Spring (ej., anotaciones
- ¿Debería importarme? No.
- Es autogenerado: Trátalo como una dependencia compilada. Lo usás, no lo modificás.
- Filosofía contract-first: El código coincide exactamente con tu spec de OpenAPI. Si necesitás cambios, actualizá el archivo YAML y regenerá.
- Libre de mantenimiento: El generador maneja las actualizaciones, así que evitás refactoring manual.
Usando el Código Generado
-
Hacé que la clase
@RestControllerimplemente la interfazApigenerada:- Java
- Kotlin
- Groovy
-
Actualizá la interfaz
Mapperasí retorna el modeloResponsegenerado en lugar del escrito a mano:- Java
- Kotlin
- Groovy
-
Actualizá la clase
@RestControllerAdviceasí retorna el modeloErrorgenerado (que modelaProblemDetail) para mantener consistencia:- Java
- Kotlin
- Groovy
-
Borrá el
FilmResponseescrito a mano, ya no es necesario.
Compilá y ejecutá la aplicación. Después andá a http://localhost:8080/api/films/42
¿Cuál Es El Punto De Generar Código?
Configurar este OpenAPI Generator puede parecer como si estuvieras realizando rituales antiguos solo para sacar algo de código. Quizás estés pensando, "¿No se suponía que esto debía ahorrarme tiempo?" Y a eso, te digo: Sí, estás invirtiendo un poco de esfuerzo inicial para evitar mucho dolor después.
El OpenAPI Generator no solo genera código; actúa como un guardián muy estricto de tu contrato de API.
- No más creación manual de DTOs: Olvidate de la tarea tediosa de escribir Data Transfer Objects (DTOs) a mano. Tu especificación de API los define, y el generador los construye perfectamente, cada vez. Esto elimina una categoría entera de typos e inconsistencias.
- Implementaciones triviales de controladores: Tus interfaces Spring
@RestController, con todas sus anotaciones de routing, también se generan. Esto significa que tus clases controller pasan de ser fábricas de boilerplate a componentes minimalistas que simplemente implementan una interfaz predefinida. - Contrato forzado por el compilador: Como tus DTOs e interfaces de controller son reflejos directos de tu spec de OpenAPI, el compilador se convierte en tu aliado más estricto. Un campo faltante, un tipo cambiado, una firma de endpoint alterada, resultará en un error de compilación. Es imposible romper tu contrato de API sin feedback inmediato.
Así que, sí, es un poco de configuración, pero ¿la recompensa? Absolutamente vale la pena.