Add support for JSpecify annotations in SpringCodegen

Closed
FE
8mo ago
+148-6
  • Introduced useJSpecify flag to enable the use of JSpecify's @Nullable annotations.
  • Modified POJO templates to correctly place JSpecify annotations for TYPE_USE compatibility.
  • Updated importMappings to handle hardcoded JSpecify annotations when enabled.
  • Added a test case for verifying correct annotation placement and behavior (issue_23206.yaml and corresponding Java test).
  • fixes #23206

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.

Summary by cubic

Adds an optional useJSpecify flag in SpringCodegen to generate JSpecify @Nullable as a TYPE_USE annotation in POJOs and include the org.jspecify:jspecify dependency when enabled. Fixes incorrect @Nullable placement and enables JSpecify-compatible builds (fixes #23206).

  • New Features

    • useJSpecify: when true, maps Nullable to org.jspecify.annotations.Nullable (overrides any user importMapping).
    • Emits @Nullable on the type for fields, getters, and setters (e.g., a.b.c.@Nullable TypeName).
    • Simplifies pojo.mustache to insert type-use annotations via x-jspecify-annotated-type.
    • Conditionally adds org.jspecify:jspecify:1.0.0 to Spring pom.mustache templates (spring-boot, spring-cloud, spring-http-interface).
    • Adds tests for schema-mapped and imported types; updates docs for Spring and Java Camel generators.
  • Migration

    • Off by default. Enable with --additional-properties useJSpecify=true.

@bbdouglas @sreeshas @jfiala @lukoyanov @cbornet @jeff9finger @karismann @Zomzog @lwlee2608 @martin-mfg