Generics-aware OpenAPI Generator extension for contract-aligned Java clients
openapi-generics-java-codegen is a custom OpenAPI Generator extension that enforces contract-first client generation.
It does not try to be smarter than your contract. It ensures the generator does not break it.
The role of this module is strict:
Prevent OpenAPI Generator from redefining platform-owned models and enforce contract-aligned output.
It is a build-time component and is typically used via openapi-generics-java-codegen-parent.
- Purpose
- Core Idea
- What It Does
- Result
- Template Integration
- How It Is Used
- Not Intended For Direct Use
- Compatibility Matrix
- Determinism Guarantees
- Design Constraints
- Mental Model
- Related Modules
- License
Default OpenAPI Generator behavior:
- regenerates response envelopes per endpoint
- flattens or loses generic semantics
- creates model drift between server and client
This module prevents that.
It ensures that generated clients:
- reuse canonical contract types (
ServiceResponse,Meta,Page, etc.) - do NOT regenerate platform-owned models
- remain aligned with server-side contract semantics
It acts as an enforcement layer between OpenAPI and generated Java code.
OpenAPI is a projection — not the source of truth
This generator enforces that rule at build time:
- platform-owned models must NOT be generated
- OpenAPI metadata must be interpreted, not materialized
If OpenAPI contains structure that already exists in the contract:
it is mapped back — not regenerated
Models marked with:
x-ignore-model: true
are treated as platform-owned.
- intercepts
fromModel - collects ignored model names
- removes models from current processing batch
- removes models from full generation graph
- removes references to ignored models from generated classes
Generated code:
- references
openapi-generics-contract - does NOT duplicate envelope types
- preserves generic semantics (
ServiceResponse<T>,Page<T>) - remains deterministic and stable
This module also provides custom templates under:
META-INF/openapi-generics/templates
This template:
- wraps generated models
- injects
ServiceResponse<T> - handles container types (
Page<T>)
Example output:
public class CustomerResponse extends ServiceResponse<CustomerDto> {}This module is not typically used directly.
Instead, it is wired via:
openapi-generics-java-codegen-parent
The parent POM:
- registers this generator
- injects templates
- configures OpenAPI Generator plugin
End users should NOT:
- reference this module directly
- configure it manually
- override generator behavior
Instead:
Use the codegen parent — it handles everything
This module is tested with the following versions:
| Component | Supported Versions |
|---|---|
| Java | 17+ |
| OpenAPI Generator | 7.x |
Notes:
restclientlibrary is available starting from OpenAPI Generator 7.6.0- If you use
restclient, you must use 7.6.0 or newer - This module is designed to work across the OpenAPI Generator 7.x series
- This is a build-time module — no runtime dependency on Spring
This generator ensures:
- ✔ No duplication of contract models
- ✔ Stable model graph
- ✔ Consistent generation output
- ✔ Preservation of generic semantics
Mechanisms:
- controlled model suppression
- explicit extension handling
- no implicit behavior
The generator:
- depends on vendor extensions (
x-*fields) - assumes contract-first design
- is tightly coupled to platform semantics
It is NOT a general-purpose generator.
Think of this module as:
A guardrail inside OpenAPI Generator that prevents contract drift
Not:
- a standalone generator
- a user-facing tool
| Module | Role |
|---|---|
openapi-generics-contract |
Defines canonical models |
openapi-generics-server-starter |
Produces OpenAPI projection |
openapi-generics-java-codegen |
Enforces generation rules |
openapi-generics-java-codegen-parent |
Orchestrates build-time generation |
MIT License