Skip to content

Merge 8.0.x into 8.1.x - #16276

Open
jamesfredley wants to merge 56 commits into
8.1.xfrom
merge/8.0.x-into-8.1.x
Open

Merge 8.0.x into 8.1.x#16276
jamesfredley wants to merge 56 commits into
8.1.xfrom
merge/8.0.x-into-8.1.x

Conversation

@jamesfredley

Copy link
Copy Markdown
Contributor

Description

Merge current 8.0.x into 8.1.x so the 8.1 line receives the already-landed 8.0 work, including the Forge Gradle 9 Shadow 8.3.11 pin from #16274.

This is a release-line merge, not a squash. One conflict was resolved in GormEntityTransformation.groovy by keeping 8.1.x's three-argument JPA association helper and carrying 8.0.x native identity injection.

RX/GORM compatibility remains a separate change in #16268. That PR already includes a cherry-pick of the Shadow pin so its Forge CI can pass before this merge lands.

Local validation on the merge tree:

  • :grails-datamapping-core:test passed after the conflict resolution
  • native-id / GORM identity tests passed
  • :grails-forge-web-netty:shadowDistTar and :grails-forge-web-netty:awsElasticBeanstalk passed with Shadow 8.3.11
  • AWS zip contains app.jar, Procfile, start.sh, and .platform/nginx/conf.d/proxy.conf

The full root ./gradlew build --rerun-tasks still hits the pre-existing RX criteria signature failure that #16268 fixes. That is unchanged on untouched origin/8.1.x.

Contributor Checklist

Issue and Scope

  • This PR is linked to an existing issue that has been acknowledged or approved by the project team. If no approved issue exists, please give background on why this change is necessary. Tickets are preferred for release change log history.
  • This PR addresses the complete scope of the linked issue. Partial implementations or unfinished work should not be submitted for review.
  • This PR contains a single, focused change. Unrelated changes should be submitted as separate pull requests.
  • This PR targets the correct branch for the type of change:
    • Patch release branches (e.g., 7.0.x): Bug fixes only. No new features or API changes.
    • Minor release branches (e.g., 7.1.x): New features are welcome, but breaking existing APIs must be avoided.
    • Major release branches (e.g., 8.0.x): Reserved for major changes. Breaking API changes are permitted.

Code Quality

  • I have added or updated tests that cover the changes introduced in this PR. All code contributions are expected to include appropriate test coverage.
  • I have verified that all existing tests pass by running ./gradlew build --rerun-tasks.
  • My code follows the project's code style guidelines. I have run ./gradlew codeStyle and resolved any violations. See Code Style for details.
  • This PR does not include mass reformatting, style-only changes, or large-scale refactoring unless it was explicitly approved in the linked issue. Unsolicited reformatting will not be accepted.
  • If generative AI tooling was used in preparing this contribution, a quality model was used to ensure contributions are consistent with the project's quality standards.

Licensing and Attribution

Documentation

  • If this PR introduces user-facing changes, I have included or updated the relevant documentation.
  • If this PR adds a new feature, I have updated the What's New section of the Grails Guide.
  • If this PR introduces breaking changes or changes that require user action during an upgrade, I have updated the Upgrade Notes for the corresponding version in the Grails Guide.
  • The PR description clearly explains what was changed and why.

Generative AI (Cursor Grok 4.6) was used to complete the merge, resolve the one conflict, and run validation. Oracle and Codex both reviewed the shipping diff as GREEN.

codeconsole and others added 30 commits August 25, 2026 01:32
A domain class that declares no id has always been given a Long one. That
is right for Hibernate and wrong for MongoDB, where a String id holding a
generated ObjectId needs no sequence collection and shards cleanly.
Declaring String id gets that, but ties the source to MongoDB: the same
class compiled against Hibernate would need Long id instead.

Add a build setting that asks each domain class for the identity type of
the GORM implementation it is mapped with:

    grails {
        gorm {
            defaultIdType = 'native'
        }
    }

GormEntityTransformation already resolved that implementation at compile
time, in pickGormEntityTrait, from mapWith plus the GormEntityTraitProviders
on the compilation classpath. That resolution now also supplies the identity
type, through a new default method on the SPI, so the trait and the id type
come from a single decision and cannot disagree. MongoEntityTraitProvider
returns String; Hibernate and Neo4j inherit Long.

The setting reaches the compiler as a system property published by the
Gradle plugin, the same way grails { compileStatic { } } already does, with
the effective value exposed as an @input so that changing it invalidates the
compile task. The default is 'long', which is the behaviour of every earlier
release.

EntityASTTransformation now runs the discovered domain injectors before
DefaultGrailsDomainClassInjector. It ran that injector first, and it
unconditionally adds a Long id, so GORM never got to decide the type on the
@grails.persistence.Entity path. Each of the default injector's injections
is guarded on the property not already being present, so it still fills in
everything GORM did not.
An action parameter typed Serializable was treated as a command object
type. Being an interface it could not be one, so it produced the warning
"Interface types and abstract class types are not supported as command
objects. This parameter will be ignored" and bound to null.

Serializable is the type a domain class identifier is declared as when the
action does not know the type itself - Long under Hibernate, String under
MongoDB - and it is what GormEntity.get(Serializable) accepts. Bind it the
way a String parameter is bound: the raw request parameter, which is a
String and so a Serializable. GORM converts it to the identity type on the
way into get(), returning null for a value that cannot be converted, so a
non-numeric id against a Long-id domain still gives a 404 rather than an
error.

The dispatch compares the declared type exactly rather than testing
assignability, so a command object that implements Serializable - as many
do - is still data bound as a command object.
The generated controllers declared show, edit, update and delete as taking
a Long id, which is only right for a domain class whose identifier is a
Long. A MongoDB domain class declaring String id - the form the GORM for
MongoDB guide recommends - bound null instead and every one of those
actions returned notFound().

Declare the parameter Serializable, which binds the raw request value and
lets GORM convert it to whatever the domain class declares: Long, String or
ObjectId. The generated services already declared get(Serializable id) and
delete(Serializable id), so this makes the controller agree with the
service it calls.
The provider was tested in isolation and the entity transformation was
tested against the system property, but nothing exercised the step between
them: the plugin attaching the provider to compileGroovy. Deleting that line
left every test passing while the setting stopped reaching the compiler and
every domain class silently kept a Long id.

Add a TestKit consumer project that states the setting the way an
application does, through grails { gorm { defaultIdType } }, and reads the
compiler worker JVM arguments back off compileGroovy. Removing the wiring
now fails two of its four cases.
The Grails Gradle plugin publishes the property name from BuildSettings and
the entity transformation reads it from a constant of its own. They are in
separate Gradle builds that cannot reference each other, so the name is
duplicated - as the compileStatic artefact opt-ins already duplicate theirs.

Nothing stopped the two drifting apart. The Gradle side asserts the literal
already; the transformation side referred to its constant symbolically, so
renaming that constant broke the feature with every test still passing, and
a build publishing a name the compiler no longer reads fails silently.

Assert the literal on the transformation side too, so a rename on either
side fails.
Use aws-actions/configure-aws-credentials v6.2.0 from
apache/infrastructure-actions approved_patterns.yml. The previous
v5.1.0 pin is not on the allowlist and fails workflow startup.

Document the allowlist in AGENTS.md so future workflow edits copy an
approved SHA instead of a newer unlisted tag.
fix: pin Forge AWS credentials action to ASF allowlist SHA
Use aws-actions/configure-aws-credentials v6.2.0 from
apache/infrastructure-actions approved_patterns.yml. The previous
v5.1.0 pin is not on the allowlist and fails workflow startup.

Document the allowlist in AGENTS.md so future workflow edits copy an
approved SHA instead of a newer unlisted tag.
Use aws-actions/configure-aws-credentials v6.2.0 from
apache/infrastructure-actions approved_patterns.yml. The previous
v5.1.0 pin is not on the allowlist and fails workflow startup.

Document the allowlist in AGENTS.md so future workflow edits copy an
approved SHA instead of a newer unlisted tag.
fix: pin Forge AWS credentials action to ASF allowlist SHA
fix: pin Forge AWS credentials action to ASF allowlist SHA
Keep only the slot input. Build the branch selected in Use workflow from.
Hard-code region and stack name. Package without running Forge tests.
Give the deploy role cloudformation:GetTemplate so UpdateEnvironment works.
Stop re-declaring the Shadow plugin; configure shadowJar when Micronaut applies it.
Keep only the slot input. Build the branch selected in Use workflow from.
Hard-code region and stack name. Package without running Forge tests.
Give the deploy role cloudformation:GetTemplate so UpdateEnvironment works.
Stop re-declaring the Shadow plugin; configure shadowJar when Micronaut applies it.
Keep only the slot input. Build the branch selected in Use workflow from.
Hard-code region and stack name. Package without running Forge tests.
Give the deploy role cloudformation:GetTemplate so UpdateEnvironment works.
Stop re-declaring the Shadow plugin; configure shadowJar when Micronaut applies it.
fix: simplify Forge AWS deploy to branch and slot
fix: simplify Forge AWS deploy to branch and slot
fix: simplify Forge AWS deploy to branch and slot
Micronaut Application Plugin puts Shadow on the classpath but does not
register shadowJar in time for awsElasticBeanstalk. Apply
com.gradleup.shadow without a version. Drop start.sh filePermissions
which fail on Gradle 9.
fix: apply Shadow so Forge AWS packaging works on Micronaut 4
Remove the five Cloud Run GitHub Actions workflows. Point RELEASE.md and
the Release workflow reminders at forge-deploy-aws.yml. Replace Cloud Run
API URLs in the Forge README with latest.grails.org and snapshot.grails.org.
Spell out the Gradle awsElasticBeanstalk command for tag-accurate
releases. Describe Cloudflare DNS as already pointing at the ALB.
docs: retire GCP Forge deploys and document AWS
jamesfredley and others added 18 commits August 28, 2026 16:21
Merge 7.2.x Forge AWS docs into 8.0.x
* Use SLF4J for runtime diagnostics

Assisted-by: opencode:gpt-5.6-sol

* Fix import order and isolate user.home in runner spec

Assisted-by: opencode:gpt-5.6-sol

* Document and de-duplicate the multi-SLF4J-provider test classpath

Copilot flagged that grails-shell-cli's test classpath carries both
slf4j-simple and logback-classic simultaneously, which SLF4J 2.x treats
as an ambiguous binding. Verified this is real: `dependencies
--configuration testRuntimeClasspath` resolves both providers together,
and neither can simply be dropped - slf4j-simple is needed at runtime
for the actual `grails` CLI executable's production logging, and
logback-classic is needed by the new Logback-appender-based forked
regression specs (SpringApplicationRunnerSpec, GrailsCliSpec).

Confirmed no current regression from this (full :grails-shell-cli:test
run is green, no "multiple SLF4J providers" warning appears in any test
output) because both new specs that need a specific provider already
pin it explicitly via -Dslf4j.provider=... in their forked child
process. This commit removes the now-fully-redundant duplicate
`testImplementation 'org.slf4j:slf4j-simple'` line (already pulled in
via the runtimeOnly dependency, so this doesn't change the resolved
classpath) and documents the coexistence so a future forked-process
fixture doesn't skip the explicit pin and hit non-deterministic
provider selection.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Fix broken imports in SchemaExportCommandSpec after upstream CLI package move

The 8.0.x branch relocated ApplicationCommand/ExecutionContext and each
SchemaExportCommand into a dedicated cli source set with new packages
(grails.dev.commands.ExecutionContext -> org.apache.grails.core.cli.
ExecutionContext, grails.plugin.hibernate.commands.SchemaExportCommand
-> org.apache.grails.data.hibernate{5,7}.cli.SchemaExportCommand) as
part of unrelated work that landed after this PR's base commit.

Merging origin/8.0.x picked this up cleanly via rename tracking for the
production SchemaExportCommand.groovy files (already updated to the new
package on merge), but the two new SchemaExportCommandSpec.groovy test
files added by this PR had no prior history for git to track the rename
through, so they were merged in unchanged - still importing the old
ExecutionContext package and referencing SchemaExportCommand unqualified
(previously fine only because the spec shared its production class's old
package). Both left compileTestGroovy failing after the merge. Fixed by
importing both classes from their new locations.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* test: record coverage for SLF4J diagnostics paths

Codecov reported 13.88% patch coverage because the fixture specs verify
the new logging behavior in forked JVMs that JaCoCo never instruments.
Forward the test JVM's JaCoCo -javaagent argument into the forked
processes so their execution data appends to the module exec file, and
exercise the remaining ProfilingGrailsPluginManager configuration
phases in-process with a probe plugin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Walter Duque de Estrada <wbduque@mac.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
GitHub Actions UpdateEnvironment failed with s3:PutObjectAcl and
s3:DeleteObject on elasticbeanstalk-<region>-<account>. Grant those
on the artifact bucket and the Elastic Beanstalk storage bucket.
fix: grant Forge AWS deploy role S3 ACL on EB bucket
GitHub Actions UpdateEnvironment failed with
autoscaling:DescribeAutoScalingGroups. Grant describe on Auto Scaling
and EC2 instances so Elastic Beanstalk can inspect the environment.
fix: grant Forge AWS deploy role Auto Scaling describe
Attach AWSElasticBeanstalkWebTier, ManagedUpdates, and
AdministratorAccess-AWSElasticBeanstalk to the deploy role, matching
what einaregilsson/beanstalk-deploy documents. Create application
versions without --process and fail fast on Elastic Beanstalk ERROR
events instead of waiting out the poll loop.
fix: Elastic Beanstalk managed policies for GitHub deploys
chore: merge 8.0.0-M6->8.0.x; bump to 8.0.0-SNAPSHOT
DEFAULT_RESOURCES_INCLUDES generates eight mappings (index, create,
save, show, edit, update, patch, delete) and DEFAULT_RESOURCE_INCLUDES
generates seven, but the guide listed only seven and six. PATCH has
been generated since the action was introduced and was never documented,
including in the "Explicit REST Mappings" equivalence list.

Also corrects the nested resources table, which gave the edit URI as
/books/${bookId}/authors/edit/${id}. The generated mapping appends
/edit after the id, as asserted by RestfulResourceMappingSpec.
Document the PATCH mapping generated by resources and single
The static initializer added by #15800 builds its Caffeine cache through
three dynamic call sites:

    ldc           class com/github/benmanes/caffeine/cache/Caffeine
    invokedynamic invoke:(Ljava/lang/Class;)Ljava/lang/Object;   // newBuilder()
    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // weakKeys()
    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // build()

In a GraalVM native image there is no method handle to link, so Groovy
falls back to IndyInterface.aotDispatch and resolves through the
metaclass, which is built from Caffeine.getDeclaredMethods() -- empty
unless the class is registered for reflection. The class initializer
fails with

    No signature of static method: newBuilder for class:
    com.github.benmanes.caffeine.cache.Caffeine

and codecLookup, gspTagLibraryLookup and groovyPagesTemplateEngine fail
with it, so the application never starts.

Six of the ten methods already carried @CompileStatic. Moving it to the
class turns those three call sites into invokestatic/invokevirtual and
needs no reachability metadata at all. addMetaMethod stays dynamic: it
resolves a metamethod by GString property name, which is the one thing
static compilation cannot express.
Shadow 8.3.6's ShadowApplicationPlugin configures the startShadowScripts
task through conventionMapping.map('mainClassName'). Gradle 9 removed the
deprecated CreateStartScripts.mainClassName in favour of the mainClass
Property, so the task can no longer be created and the Forge build fails
at configuration time:

    Could not determine the dependencies of task
    ':grails-forge-web-netty:shadowDistTar'.
    > Could not create task ':grails-forge-web-netty:startShadowScripts'.
       > You can't map a property that does not exist: propertyName=mainClassName

Shadow is only applied to grails-forge-web-netty because the AWS Elastic
Beanstalk packaging came over from 7.2.x, which builds Forge on Gradle
8.14.5 where mainClassName still exists. Shadow 8.3.7 backported Gradle 9
support and 8.3.11 is the latest 8.3.x; the 8.x line is maintenance-only
upstream, so Forge's own build should follow the generated applications to
Shadow 9 (already 9.2.2 in the Forge dependency catalog) in a later change,
which needs the Transformer -> ResourceTransformer migration in buildSrc.
…e-static-8.0.x

Fix Grails Forge build on Gradle 9 by bumping Shadow to 8.3.11
Resolve GormEntityTransformation by keeping 8.1.x's three-argument
JPA association helper and carrying 8.0.x native identity injection.

Assisted-by: Cursor Grok 4.6
Copilot AI lite review requested due to automatic review settings August 30, 2026 15:41

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

Release-branch merge bringing 8.0.x changes forward into 8.1.x, including Gradle/Forge build compatibility fixes and several framework/runtime improvements (GORM identity typing, CLI/logging behavior, and REST/scaffolding updates).

Changes:

  • Bumps Grails Forge Shadow plugin to 8.3.11 to restore Gradle 9 compatibility.
  • Adds/builds support for portable vs native GORM identity typing (grails.gorm.defaultIdType) across compiler/Gradle plugin/runtime mapping contexts, with tests and docs.
  • Replaces various printStackTrace()/stdout profiling with SLF4J logging and adds forked-process specs to assert logging behavior.

Reviewed changes

Copilot reviewed 71 out of 71 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
grails-shell-cli/src/test/resources/org/grails/cli/compiler/dependencies/spring-boot-dependencies-effective-bom.xml Adds test BOM fixture resource
grails-shell-cli/src/test/groovy/org/grails/cli/GrailsCliSpec.groovy Forked-process spec for settings parse failures
grails-shell-cli/src/test/groovy/org/grails/cli/GrailsCliLoggingVerifier.groovy Verifies CLI logging + stderr output
grails-shell-cli/src/test/groovy/org/grails/cli/command/run/SpringApplicationRunnerSpec.groovy Forked-process specs for runner failure modes
grails-shell-cli/src/test/groovy/org/grails/cli/command/run/LifecycleVerifier.groovy Runner lifecycle/logging assertion helper
grails-shell-cli/src/main/groovy/org/grails/cli/GrailsCli.groovy Logs shared settings load failures via SLF4J
grails-shell-cli/src/main/groovy/org/grails/cli/command/run/SpringApplicationRunner.java Routes failure reporting through SLF4J where possible
grails-shell-cli/build.gradle Adds Logback for tests; documents multi-provider handling
grails-scaffolding/src/main/templates/scaffolding/Controller.groovy Scaffolding controller IDs use Serializable
grails-scaffolding/src/main/templates/scaffolding/AsyncController.groovy Async scaffolding controller IDs use Serializable
grails-profiles/rest-api/templates/artifacts/scaffolding/Controller.groovy REST profile scaffolding IDs use Serializable
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/settings.gradle Adds functional test project for idType wiring
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/grails-app/conf/application.yml Functional test app config fixture
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/gradle.properties Functional test project version placeholder
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/build.gradle Functional test task to inspect compiler args/build info
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/settings.gradle Adds multi-project consumer fixture
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/plugin/src/main/java/example/PortableBook.java Portable plugin domain identity fixture
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/plugin/build.gradle Plugin fixture build
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/gradle.properties Consumer fixture version placeholder
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/build.gradle Fixture task to inspect args + class output
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/app/grails-app/conf/application.yml Consumer app config fixture
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/app/build.gradle Consumer app fixture build
grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGormIdTypeProviderSpec.groovy Unit tests for id-type argument provider
grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GormDefaultIdTypeFunctionalSpec.groovy Gradle TestKit functional coverage for wiring
grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy Publishes idType to compiler workers + build info
grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGormOptions.groovy Adds Gradle extension block for GORM compile options
grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGormIdTypeProvider.groovy JVM arg provider for defaultIdType
grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsExtension.groovy Adds nested gorm {} extension block
grails-gradle/model/src/main/groovy/grails/util/BuildSettings.groovy Adds constants for grails.gorm.defaultIdType
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/PomDependencyVersionResolverSpec.groovy Adds coverage for malformed POM resources
grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/PomDependencyVersionResolver.java Logs malformed POM parsing via SLF4J
grails-forge/grails-forge-core/build.gradle Promotes logback to testImplementation for new spec
grails-forge/gradle.properties Bumps Shadow to 8.3.11
grails-encoder/src/main/groovy/org/grails/encoder/CodecMetaClassSupport.groovy Adjusts compilation strategy for native-image compatibility
grails-doc/src/en/guide/theWebLayer/urlmappings/restfulMappings.adoc Documents PATCH mappings + URL tweaks
grails-doc/src/en/guide/REST/restfulControllers/restControllersStepByStep.adoc Adds PATCH to REST controller walkthrough
grails-doc/src/en/guide/REST/restfulControllers/extendingRestfulController.adoc Adds PATCH mapping to extension doc
grails-doc/src/en/guide/introduction/whatsNew.adoc Documents new GORM default id type feature
grails-datastore-core/src/test/groovy/org/grails/datastore/mapping/core/connections/ConnectionSourceSettingsBuilderSpec.groovy Tests runtime config defaultIdType parsing
grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/connections/ConnectionSourceSettings.groovy Adds defaultIdType runtime setting field
grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java Ensures GORM transformer runs with highest precedence
grails-datamapping-core/src/test/groovy/org/grails/compiler/gorm/GormEntityIdentityTypeSpec.groovy Tests compiler-side idType property contract
grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTransformation.groovy Injects id type based on trait + system property
grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTraitProvider.groovy Adds default identity-type contract to providers
grails-data-mongodb/docs/src/docs/asciidoc/objectMapping/idGeneration.adoc Documents native identity types for MongoDB
grails-data-mongodb/core/src/test/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContextSpec.groovy Tests portable identity mapping behavior
grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/PortableIdentityPersistenceSpec.groovy TCK spec for portable id persistence
grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/MongoEntityIdentityTypeSpec.groovy Tests compile-time id injection for Mongo
grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContext.java Resolves Serializable id type via defaultIdType
grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.groovy Declares Mongo default identity type as String
grails-data-hibernate7/grails-plugin/src/test-cli/groovy/grails/plugin/hibernate/commands/SchemaExportCommandSpec.groovy Forked-process spec for schema export logging
grails-data-hibernate7/grails-plugin/src/cli/groovy/org/apache/grails/data/hibernate7/cli/SchemaExportCommand.groovy Logs/prints schema export failures consistently
grails-data-hibernate7/grails-plugin/build.gradle Adds slf4j-simple for CLI test fixture
grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextSpec.groovy Tests portable identity mapping + persistence
grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateMappingFactory.groovy Treats Serializable id as portable (Long) for Hibernate
grails-data-hibernate5/grails-plugin/src/test-cli/groovy/grails/plugin/hibernate/commands/SchemaExportCommandSpec.groovy Forked-process spec for schema export logging (H5)
grails-data-hibernate5/grails-plugin/src/cli/groovy/org/apache/grails/data/hibernate5/cli/SchemaExportCommand.groovy Logs/prints schema export failures consistently (H5)
grails-data-hibernate5/grails-plugin/build.gradle Adds slf4j-simple for CLI test fixture (H5)
grails-core/src/test/groovy/org/grails/plugins/ProfilingGrailsPluginManagerSpec.groovy Verifies profiling goes to logs (not stdout)
grails-core/src/test/groovy/org/grails/compiler/injection/DefaultDomainClassInjectorSpec.groovy Adds assertions for id/version injection behavior
grails-core/src/test/groovy/grails/boot/config/GrailsEnvironmentPostProcessorSpec.groovy Tests build-info property source precedence
grails-core/src/main/resources/META-INF/spring-configuration-metadata.json Documents grails.gorm.defaultIdType config key
grails-core/src/main/groovy/org/grails/plugins/ProfilingGrailsPluginManager.java Switches profiling output from stdout to SLF4J
grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java Sorts injectors by Spring OrderComparator
grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java Ensures GORM injectors run before default injector
grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java Documents injector ordering/identity-type implications
grails-core/src/main/groovy/grails/boot/config/GrailsEnvironmentPostProcessor.java Loads build-info properties as low-precedence defaults
grails-controllers/src/test/groovy/org/grails/compiler/web/ControllerActionTransformerSerializableParameterSpec.groovy Tests Serializable action param binding
grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerActionTransformer.java Binds Serializable action params like String
grails-bootstrap/src/test-cli/groovy/grails/build/logging/GrailsConsoleLoggingSpec.groovy Forked-process spec for console instantiation logging
grails-bootstrap/src/cli/groovy/grails/build/logging/GrailsConsole.java Logs console instantiation failures via SLF4J

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@bito-code-review

Copy link
Copy Markdown

The file grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java is not present in the provided pull request diff. As a result, I cannot analyze or provide a correction for the reported RuntimeException message interpolation issue.

…Transformation

The internal-error RuntimeException message used $node.class/$parent.class
GString syntax inside a .java file, so it printed the literal placeholder
text instead of the actual AST node types, per Copilot review on #16276.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019gk2CXELi2vqfcqGi1yYoV
@borinquenkid
borinquenkid self-requested a review August 30, 2026 16:19

@borinquenkid borinquenkid left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Once I fixed the GString approved

@jamesfredley jamesfredley mentioned this pull request Aug 30, 2026
16 tasks
@codecov

codecov Bot commented Aug 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.47619% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 30.1520%. Comparing base (bb21a3a) to head (0015d6e).

Files with missing lines Patch % Lines
...rails/gradle/plugin/core/GrailsGradlePlugin.groovy 0.0000% 2 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@                Coverage Diff                 @@
##                8.1.x     #16276        +/-   ##
==================================================
+ Coverage     29.8834%   30.1520%   +0.2687%     
- Complexity        509        517         +8     
==================================================
  Files              79         81         +2     
  Lines            4715       4736        +21     
  Branches          814        816         +2     
==================================================
+ Hits             1409       1428        +19     
- Misses           3063       3065         +2     
  Partials          243        243                
Files with missing lines Coverage Δ
...l/src/main/groovy/grails/util/BuildSettings.groovy 19.0476% <ø> (ø)
...g/grails/gradle/plugin/core/GrailsExtension.groovy 55.3571% <100.0000%> (+4.3768%) ⬆️
...gradle/plugin/core/GrailsGormIdTypeProvider.groovy 100.0000% <100.0000%> (ø)
...grails/gradle/plugin/core/GrailsGormOptions.groovy 100.0000% <100.0000%> (ø)
...rails/gradle/plugin/core/GrailsGradlePlugin.groovy 0.0000% <0.0000%> (ø)
🚀 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.

Remove the accidental criteria list overload that conflicts with the
reactive return type, and update RX tenant and count finder integration
for current datastore APIs.

Cherry-picked from bc864c6 to unblock #16276 CI.

Assisted-by: Cursor Grok 4.6
@testlens-app

testlens-app Bot commented Aug 30, 2026

Copy link
Copy Markdown

✅ All tests passed ✅

🏷️ Commit: 0015d6e
▶️ Tests: 73977 executed
⚪️ Checks: 89/89 completed


Learn more about TestLens at testlens.app/docs.

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

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

5 participants