Merge 8.0.x into 8.1.x - #16276
Conversation
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
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
….0.x GORM Native Datastore Id Support
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
There was a problem hiding this comment.
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.11to 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.
|
The file |
…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
left a comment
There was a problem hiding this comment.
Once I fixed the GString approved
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ 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
🚀 New features to boost your workflow:
|
✅ All tests passed ✅🏷️ Commit: 0015d6e Learn more about TestLens at testlens.app/docs. |
Description
Merge current
8.0.xinto8.1.xso the 8.1 line receives the already-landed 8.0 work, including the Forge Gradle 9 Shadow8.3.11pin from #16274.This is a release-line merge, not a squash. One conflict was resolved in
GormEntityTransformation.groovyby 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:testpassed after the conflict resolution:grails-forge-web-netty:shadowDistTarand:grails-forge-web-netty:awsElasticBeanstalkpassed with Shadow8.3.11app.jar,Procfile,start.sh, and.platform/nginx/conf.d/proxy.confThe full root
./gradlew build --rerun-tasksstill hits the pre-existing RX criteria signature failure that #16268 fixes. That is unchanged on untouchedorigin/8.1.x.Contributor Checklist
Issue and Scope
7.0.x): Bug fixes only. No new features or API changes.7.1.x): New features are welcome, but breaking existing APIs must be avoided.8.0.x): Reserved for major changes. Breaking API changes are permitted.Code Quality
./gradlew build --rerun-tasks../gradlew codeStyleand resolved any violations. See Code Style for details.Licensing and Attribution
Documentation
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.