Skip to content

Automate configuration metadata for @ConfigurationProperties modules - #16047

Open
jamesfredley wants to merge 10 commits into
8.0.xfrom
feature/automated-configuration-metadata
Open

Automate configuration metadata for @ConfigurationProperties modules#16047
jamesfredley wants to merge 10 commits into
8.0.xfrom
feature/automated-configuration-metadata

Conversation

@jamesfredley

@jamesfredley jamesfredley commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What this does

Closes #15469 for the five modules that already use @ConfigurationProperties:

  • grails-cache
  • grails-databinding
  • grails-views-gson
  • grails-views-markup
  • grails-web-url-mappings (CORS owner)

Each publishes standard Spring Boot metadata at META-INF/spring-configuration-metadata.json during the module build. IDEs, config-report, and the Application Properties reference consume that resource.

This is not Spring Boot's spring-boot-configuration-processor. That approach was tried in #15566 and closed because Java annotation processors break incremental Groovy compilation. This PR uses a Grails-owned path instead:

  1. Groovy: a semantic-analysis AST transform embeds a private synthetic metadata payload on each compiled @ConfigurationProperties class (no shared processor output).
  2. Java: ASM reads compiled bytecode without classloading.
  3. Build: a cacheable Gradle task merges class payloads after compilation, applies curated overlays, and writes one standard metadata file into resources/jars.

Migration details

Module Change
Cache / Data Binding / JSON Views Hand-written spring-configuration-metadata.json renamed to additional-spring-configuration-metadata.json (overlay). Overlay values win for matching identities.
Markup Views No prior metadata file on 8.0.x; generation now publishes bindable Markup Views properties.
CORS Moved from grails-web-core into grails-web-url-mappings with GrailsCorsConfiguration. Non-CORS web-core metadata stays hand-maintained in grails-web-core.

Generated defaults only include compile-time constants. Dynamic Groovy defaults are omitted unless an overlay supplies an authoritative value.

Compatibility check (against origin/8.0.x)

Re-verified on exact PR HEAD after regenerating metadata:

Source Result
Cache 1 group / 6 properties preserved, no changes
Data Binding 1 group / 5 properties preserved, no changes
JSON Views 1 group / 9 properties preserved, no changes; +9 inferred template/base properties
CORS 1 group / 9 properties preserved and relocated to URL Mappings, no changes
Web-core non-CORS 10 groups / 24 properties still present in grails-web-core
Markup Views New generated group/properties (no prior 8.0.x file)

Each migrated jar contains exactly one standard metadata resource plus any curated additional metadata file.

Scope notes

  • Completes issue Phase 1 for the five existing @ConfigurationProperties modules.
  • Does not migrate Groovy-DSL-only config (e.g. Spring Security DefaultSecurityConfig, general application.groovy merging). Those remain later work.
  • Immutable constructor-bound properties are supported when Boot-compatible constructor selection applies; curated overlays remain the fallback for non-inferable metadata.

Verification

Local:

  • :grails-configuration-metadata:test + codeStyle
  • full ConfigurationMetadataPluginSpec (clean, incremental, edit, delete, overlay, duplicate, immutable, generic-constructor safety)
  • tests for Cache, Data Binding, JSON Views, Markup Views, URL Mappings, and affected Web Core
  • ConfigReportCommandSpec
  • :grails-doc:publishGuide -x aggregateGroovydoc
  • clean Checkstyle / CodeNarc / PMD / SpotBugs aggregates
  • semantic zero-loss comparison + jar resource inspection

CI on this PR: core builds (Linux/macOS), style/analysis/RAT/CodeQL/coverage, Forge, functional, security, Redis, MongoDB, and Hibernate suites are green. A few long jobs (Windows core, joint Groovy validation, selected functional reruns) were still finishing at description update time.

Commits

  1. Compiler module + AST transform
  2. Build-logic Gradle plugin + TestKit
    3-7. Per-module migrations (cache, databinding, gson, markup, URL mappings/CORS)
    8-9. Docs reference inputs + guide prose
  3. Immutable constructor-bound metadata support

Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Copilot AI review requested due to automatic review settings July 23, 2026 20:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Introduces a new build-time pipeline to generate Spring Boot configuration metadata from compiled Groovy/Java @ConfigurationProperties classes, merging in curated additional-spring-configuration-metadata.json overlays and wiring the results into the docs config reference generation.

Changes:

  • Adds grails-configuration-metadata compiler module with a Groovy SEMANTIC_ANALYSIS AST transformation to embed deterministic metadata payloads in compiled Groovy configuration classes.
  • Adds a Gradle build-logic plugin (org.apache.grails.buildsrc.configuration-metadata) that scans compiled bytecode (ASM), merges curated overlays, and publishes a single standard META-INF/spring-configuration-metadata.json resource per jar.
  • Migrates existing curated metadata to additional-spring-configuration-metadata.json, relocates CORS metadata ownership to URL Mappings, and expands the docs config-reference pipeline inputs.

Reviewed changes

Copilot reviewed 19 out of 22 changed files in this pull request and generated no comments.

Show a summary per file
File Description
settings.gradle Includes new grails-configuration-metadata module in the multi-project build.
gradle/publish-root-config.gradle Publishes the new grails-configuration-metadata module.
dependencies.gradle Adds ASM to the build BOM dependencies for bytecode scanning.
build-logic/plugins/build.gradle Adds ASM dependency and registers the new configuration metadata Gradle plugin.
build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/ConfigurationMetadataPlugin.groovy Implements bytecode scanning + overlay merge + deterministic metadata output task wired into processResources.
build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/ConfigurationMetadataPluginSpec.groovy TestKit coverage for clean/incremental/edit/deletion/overlay/duplicates/no-overlay behavior.
grails-configuration-metadata/build.gradle New compiler module build definition and test dependencies.
grails-configuration-metadata/src/main/groovy/org/apache/grails/configuration/metadata/ConfigurationMetadataTransformation.groovy Groovy AST transform embedding per-class metadata payloads (constant defaults only).
grails-configuration-metadata/src/main/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation Registers the global AST transformation.
grails-configuration-metadata/src/test/groovy/org/apache/grails/configuration/metadata/ConfigurationMetadataTransformationSpec.groovy Unit tests validating payload shape, defaults policy, and reserved-field collision handling.
grails-cache/build.gradle Applies the new configuration metadata build plugin.
grails-cache/src/main/resources/META-INF/additional-spring-configuration-metadata.json Adds curated cache metadata overlay for merge with generated metadata.
grails-databinding/build.gradle Applies the new configuration metadata build plugin.
grails-databinding/src/main/resources/META-INF/additional-spring-configuration-metadata.json Adds curated data binding metadata overlay.
grails-views-gson/build.gradle Applies the new configuration metadata build plugin.
grails-views-gson/src/main/resources/META-INF/additional-spring-configuration-metadata.json Adds curated JSON Views metadata overlay.
grails-views-markup/build.gradle Applies the new configuration metadata build plugin.
grails-web-url-mappings/build.gradle Applies the new configuration metadata build plugin.
grails-web-url-mappings/src/main/resources/META-INF/additional-spring-configuration-metadata.json Adds curated URL Mappings/CORS metadata overlay (migrated from web-core).
grails-web-core/src/main/resources/META-INF/spring-configuration-metadata.json Removes CORS group/properties now owned by URL Mappings.
grails-doc/src/en/guide/conf/config.adoc Documents how Grails produces/overlays configuration metadata and its defaults policy.
grails-doc/build.gradle Adds migrated module jars as inputs to the configuration reference generation pipeline.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 51.38889% with 70 lines in your changes missing coverage. Please review.
✅ Project coverage is 51.4794%. Comparing base (c6ce3fe) to head (b792a3f).

Files with missing lines Patch % Lines
...etadata/ConfigurationMetadataTransformation.groovy 51.3889% 35 Missing and 35 partials ⚠️
Additional details and impacted files

Impacted file tree graph

@@                Coverage Diff                 @@
##                8.0.x     #16047        +/-   ##
==================================================
- Coverage     51.4910%   51.4794%   -0.0117%     
- Complexity      17762      17793        +31     
==================================================
  Files            2039       2040         +1     
  Lines           95537      95681       +144     
  Branches        16571      16610        +39     
==================================================
+ Hits            49193      49256        +63     
- Misses          39037      39084        +47     
- Partials         7307       7341        +34     
Files with missing lines Coverage Δ
...etadata/ConfigurationMetadataTransformation.groovy 51.3889% <51.3889%> (ø)

... and 5 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jamesfredley jamesfredley moved this to In Progress in Apache Grails Jul 23, 2026
@jamesfredley jamesfredley self-assigned this Jul 23, 2026
@jamesfredley jamesfredley added this to the grails:8.0.0-RC1 milestone Jul 23, 2026
@jamesfredley jamesfredley changed the title Automate configuration metadata generation Automate configuration metadata for @ConfigurationProperties modules Jul 23, 2026
@testlens-app

testlens-app Bot commented Jul 23, 2026

Copy link
Copy Markdown

✅ All tests passed ✅

🏷️ Commit: b792a3f
▶️ Tests: 56590 executed
⚪️ Checks: 60/60 completed


Learn more about TestLens at testlens.app.

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

Labels

None yet

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

Migrate configuration metadata to @ConfigurationProperties with annotation processor for Grails 8

2 participants