Skip to content

[KOTLIN-SPRING] - add support for 'openApiNullable' - jackson nullable library to handle non-required AND nullable: true properties#23804

Open
Picazsoo wants to merge 9 commits into
OpenAPITools:masterfrom
Picazsoo:feature/add-support-for-OpenAPI-Jackson-Nullable-library-to-handle-optional-and-nullable-properties
Open

[KOTLIN-SPRING] - add support for 'openApiNullable' - jackson nullable library to handle non-required AND nullable: true properties#23804
Picazsoo wants to merge 9 commits into
OpenAPITools:masterfrom
Picazsoo:feature/add-support-for-OpenAPI-Jackson-Nullable-library-to-handle-optional-and-nullable-properties

Conversation

@Picazsoo
Copy link
Copy Markdown
Contributor

@Picazsoo Picazsoo commented May 17, 2026

Purpose of this PR is to allow proper handling of nullable: true attributes that are not included in the list of required attributes. This is needed to be able to handle e.g. JSON Merge Patch (RFC 7396) - ability to differentiate between omitting an attribute in the json or explicitly setting it to null to either skip modifying it / set it to null.

This is already supported in java spring codegen, so this brings the two spring generators closer to feature parity.
The feature is opt-in by setting 'openApiNullable' to true.

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package || exit
    ./bin/generate-samples.sh ./bin/configs/*.yaml || exit
    ./bin/utils/export_docs_generators.sh || exit
    
    (For Windows users, please run the script in WSL)
    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.
  • File the PR against the correct branch: master (upcoming 7.x.0 minor release - breaking changes with fallbacks), 8.0.x (breaking changes without fallbacks)
  • If your PR solves a reported issue, reference it using GitHub's linking syntax (e.g., having "fixes #123" present in the PR description)
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request. - tagging @karismann (2019/03) @Zomzog (2019/04) @andrewemery (2019/10) @4brunu (2019/11) @yutaka0m (2020/03) @stefankoppier (2022/06) @e5l (2024/10) @dennisameling (2026/02) @wing328

Summary by cubic

Adds openApiNullable support to Kotlin Spring generators to correctly model optional + nullable properties with a 3‑state type. Enable with openApiNullable: true to use JsonNullable, reject explicit nulls where not allowed, and have the generator add the dependency and module wiring.

  • New Features

    • New openApiNullable option for Kotlin Spring generators.
    • Maps required: false, nullable: true to JsonNullable<T> (present/null/absent).
    • Adds @JsonSetter(nulls = Nulls.FAIL) for optional non‑nullable fields.
    • Registers JsonNullableModule bean in the generated Spring Boot app.
    • Adds org.openapitools:jackson-databind-nullable to generated Gradle/Maven files (SB2 uses 0.2.8; SB3/SB4 use 0.2.10).
    • Works with Jackson 2 and Jackson 3 (require jackson-databind-nullable ≥ 0.2.10 for Jackson 3).
    • Docs updated and tests added for the 4 required/nullable states and $ref types; samples regenerated.
  • Refactors

    • Centralized OPENAPI_NULLABLE in CodegenConstants and aligned usage across Java/Kotlin codegens.
    • Refined Jackson annotation import mappings for Jackson 3; fixed Kotlin template imports.
    • Improved springBootApplication.mustache structure and conditional module registration.
    • Minor template dependency updates (e.g., Kotlin 1.9.25 in SB3 POMs) and added test dependencies where appropriate.

Written for commit 1cbd619. Summary will update on new commits. Review in cubic

@Picazsoo Picazsoo marked this pull request as ready for review May 17, 2026 14:16
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 270 files

Note: This PR contains a large number of files. cubic only reviews up to 100 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.
On a pro plan you can use ultrareview for larger PRs.
Re-trigger cubic

@Picazsoo Picazsoo marked this pull request as draft May 17, 2026 14:25
@Picazsoo Picazsoo changed the title Feature/add support for open api jackson nullable library to handle optional and nullable properties [KOTLIN-SPRING] - add support for 'openApiNullable' - jackson nullable library to handle non-required AND nullable: true properties May 17, 2026
@Picazsoo Picazsoo marked this pull request as ready for review May 17, 2026 22:02
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 270 files

Note: This PR contains a large number of files. cubic only reviews up to 100 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.
On a pro plan you can use ultrareview for larger PRs.
Re-trigger cubic


if (isUseJackson3()) {
// Override databind imports for Jackson 3
importMapping.put("JsonDeserialize", "tools.jackson.databind.annotation.JsonDeserialize");
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was not being set anywhere until now as far as I can tell. So on jackson 2 the JsonDeserialize simply was not imported.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant