[Java][Spring] Add useRecords: generate plain models as records
Merged
SE
4d ago+4228+4228+0123456789012345678901234567890123456789-1-1-0123456789
Adds useRecords to the spring generator, off by default. Models without inheritance, additionalProperties or a oneOf role become records with validation, JsonNullable and defaults; all other models are generated as before. A null component gets the property's default: a record cannot tell null from absent. First step towards #10490: builders, oneOf with sealed interfaces, additionalProperties and allOf follow as separate PRs.
@cachescrubber @welshm @MelleD @atextor @manedev79 @javisst @borsch @banlevente @Zomzog @martin-mfg @KannaKim
PR checklist
- Read the contribution guidelines.
- Run the following to build the project and update samples:
(For Windows users, please run the script in WSL)./mvnw clean package || exit ./bin/generate-samples.sh ./bin/configs/*.yaml || exit ./bin/utils/export_docs_generators.sh || exit
Commit all changed files.
This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
These must match the expectations made by your contribution.
You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example./bin/generate-samples.sh bin/configs/java*.
IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed. - If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.
Summary by cubic
Adds useRecords to the Spring generator, off by default. Models that qualify now generate as Java records with validation, JsonNullable, and defaults; all other models stay classes and the reason is logged.
- A null component takes the property's default because a record cannot distinguish null from absent.
- Requires Spring Boot 3 or 4 and is incompatible with hateoas, Lombok annotations,
generateBuilders,withXml, anduseOptional; the option is also disabled forjava-camel. - First step towards #10490; builders, oneOf with sealed interfaces,
additionalProperties, and allOf follow in separate PRs.