This is an automated email from the ASF dual-hosted git repository. jdaugherty pushed a commit to branch 8.0.x in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit f88784b5db279bdca570eab7869f01ee07bfc8cf Merge: 75e5ff63d7 1b67ebd322 Author: James Daugherty <[email protected]> AuthorDate: Wed Nov 26 08:56:44 2025 -0500 Merge branch '7.1.x' into 8.0.x .github/scripts/releaseDistributions.sh | 15 +- .github/scripts/releaseJarFiles.sh | 9 +- .github/vote_templates/announce.txt | 14 +- .github/vote_templates/staged.txt | 20 +- .github/vote_templates/vote_succeeded.txt | 12 + .github/workflows/release.yml | 685 +++++++++++---------- .sdkmanrc | 2 +- RELEASE.md | 36 +- .../apache/grails/buildsrc/PublishPlugin.groovy | 2 +- dependencies.gradle | 16 +- etc/bin/Dockerfile | 4 +- etc/bin/verify.sh | 29 +- .../groovy/org/grails/config/NavigableMap.groovy | 83 +-- .../src/main/resources/grails-banner.txt | 3 +- .../grails/config/SpringProfileExcludeSpec.groovy | 173 ++++++ grails-cache/build.gradle | 5 +- .../ConvertersConfigurationInitializer.java | 26 +- .../converters/marshaller/json/EnumMarshaller.java | 4 + .../marshaller/json/GenericJavaBeanMarshaller.java | 1 + .../marshaller/json/GroovyBeanMarshaller.java | 1 + ...umMarshaller.java => SimpleEnumMarshaller.java} | 20 +- .../converters/marshaller/xml/EnumMarshaller.java | 4 + .../marshaller/xml/GenericJavaBeanMarshaller.java | 1 + .../marshaller/xml/GroovyBeanMarshaller.java | 1 + ...umMarshaller.java => SimpleEnumMarshaller.java} | 12 +- .../marshaller/json/StaticPropertySpec.groovy | 68 ++ .../src/main/groovy/grails/boot/GrailsApp.groovy | 5 +- .../main/groovy/grails/boot/GrailsBanner.groovy | 380 ++++++++++++ .../additional-spring-configuration-metadata.json | 37 ++ grails-data-hibernate5/dbmigration/build.gradle | 1 - .../advancedGORMFeatures/ormdsl/caching.adoc | 16 +- grails-data-hibernate5/grails-plugin/build.gradle | 1 - grails-data-mongodb/grails-plugin/build.gradle | 5 +- .../examples/grails3-neo4j-hibernate/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../examples/grails3-neo4j/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../datastore/gorm/CustomAutoTimestampSpec.groovy | 77 ++- .../grails/gorm/annotation/AutoTimestamp.java | 2 + .../{AutoTimestamp.java => CreatedBy.java} | 41 +- .../{AutoTimestamp.java => CreatedDate.java} | 19 +- .../{AutoTimestamp.java => LastModifiedBy.java} | 41 +- .../{AutoTimestamp.java => LastModifiedDate.java} | 19 +- .../gorm/events/AutoTimestampEventListener.java | 124 +++- .../datastore/gorm/timestamp/AuditorAware.java | 58 ++ .../AbstractMethodDecoratingTransformation.groovy | 2 - .../eval/DefaultConstraintEvaluator.java | 26 +- .../registry/DefaultValidatorRegistry.groovy | 5 +- .../mapping/config/AuditMetadataType.java | 58 ++ .../datastore/mapping/config/Property.groovy | 6 + .../grails/datastore/mapping/config/Settings.java | 2 + .../connections/ConnectionSourceSettings.groovy | 5 + .../mapping/model/AuditMetadataUtils.java | 186 ++++++ grails-dependencies/assets/build.gradle | 1 + .../guide/cache/cacheUsage/cacheConfiguration.adoc | 2 +- .../en/guide/cache/cacheUsage/cacheUnitTests.adoc | 4 +- .../gradleBuild/gradleDependencies.adoc | 1 + .../guide/conf/applicationClass/customizing.adoc | 125 ++++ grails-doc/src/en/guide/introduction/whatsNew.adoc | 4 +- .../introduction/whatsNew/dependencyUpgrades.adoc | 2 +- .../en/guide/testing/unitTesting/annotations.adoc | 6 +- .../unitTesting/unitTestingDomainClasses.adoc | 10 +- .../unitTesting/unitTestingUrlMappings.adoc | 2 +- .../guide/theWebLayer/gson/jsonInstallation.adoc | 19 +- grails-doc/src/en/guide/theWebLayer/gsp.adoc | 2 +- .../src/en/guide/upgrading/upgrading60x.adoc | 566 ++++++++++++++++- .../plugins/domain/DomainClassGrailsPlugin.groovy | 14 + grails-fields/build.gradle | 2 - .../plugin/formfields/FormFieldsTagLib.groovy | 3 +- .../scaffolding/model/DomainModelService.groovy | 1 + .../model/DomainModelServiceImpl.groovy | 82 ++- .../forge/feature/assetPipeline/AssetPipeline.java | 5 + .../build/gradle/templates/buildGradle.rocker.raw | 7 - .../templates/gradleWrapperProperties.rocker.raw | 5 - .../grails/templates/urlMappings.rocker.raw | 1 + .../feature/test/GebWithWebDriverBinaries.java | 9 +- .../grails/forge/io/FileSystemOutputHandler.java | 67 +- .../main/java/org/grails/forge/io/OutputUtils.java | 61 ++ .../java/org/grails/forge/io/ZipOutputHandler.java | 52 +- .../resources/assets/javascripts/application.js | 4 +- .../resources/assets/stylesheets/application.css | 6 +- .../src/main/resources/gsp/index.gsp | 2 +- .../grails-forge-core/src/main/resources/pom.xml | 14 +- .../test/GebWithWebDriverBinariesSpec.groovy | 4 +- .../org/grails/forge/create/CreateAppSpec.groovy | 2 +- grails-geb/build.gradle | 1 - .../testFixtures/resources/docker-java.properties | 2 + .../model/src/main/groovy/grails/io/IOUtils.groovy | 5 +- .../main/groovy/grails/util/BuildSettings.groovy | 2 +- .../src/test/groovy/grails/io/IOUtilsSpec.groovy | 11 +- .../gradle/plugin/core/GrailsExtension.groovy | 16 + .../gradle/plugin/core/GrailsGradlePlugin.groovy | 74 ++- .../plugin/core/GrailsPluginGradlePlugin.groovy | 7 +- grails-gsp/grails-sitemesh3/build.gradle | 2 - grails-gsp/plugin/build.gradle | 2 - grails-gsp/spring-boot/build.gradle | 4 +- grails-profiles/web/profile.yml | 2 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 6 +- .../UrlMappings.groovy | 1 + .../web/skeleton/grails-app/views/index.gsp | 2 +- .../grails/rest/render/ContainerRenderer.groovy | 2 +- .../main/groovy/grails/rest/render/Renderer.groovy | 2 +- .../rest/render/errors/VndErrorJsonRenderer.groovy | 3 +- .../rest/render/errors/VndErrorXmlRenderer.groovy | 3 +- .../grails/rest/render/hal/HalJsonRenderer.groovy | 2 +- .../render/util/AbstractLinkingRenderer.groovy | 4 +- .../rest/render/json/DefaultJsonRenderer.groovy | 2 +- grails-scaffolding/build.gradle | 8 +- .../plugin/scaffolding/DomainServiceLocator.java | 29 +- .../grails/plugin/scaffolding/GormService.groovy | 13 +- .../scaffolding/ScaffoldingGrailsPlugin.groovy | 1 + .../scaffolding/ScaffoldingViewResolver.groovy | 165 +++-- .../scaffolding/ScaffoldingViewResolverSpec.groovy | 273 ++++++++ grails-test-examples/app1/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- grails-test-examples/app2/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../BasicCachingServiceNoCacheManagerSpec.groovy | 2 + .../groovy/com/demo/BasicCachingServiceSpec.groovy | 2 + grails-test-examples/demo33/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- .../grails-app/controllers/demo/UrlMappings.groovy | 2 + .../demo33/grails-app/domain/demo/Person.groovy | 3 +- .../groovy/demo/DependencyInjectionSpec.groovy | 2 + .../src/test/groovy/demo/DataTestTraitSpec.groovy | 2 + .../demo/GetDomainClassesToMockMethodSpec.groovy | 2 + .../test/groovy/demo/PersonControllerSpec.groovy | 2 + .../demo33/src/test/groovy/demo/PersonSpec.groovy | 2 + grails-test-examples/geb-gebconfig/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- grails-test-examples/geb/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- .../org/demo/spock/PerTestRecordingSpec.groovy | 48 +- grails-test-examples/gsp-layout/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- grails-test-examples/gsp-sitemesh3/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- .../grails-database-per-tenant/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../hibernate5/grails-hibernate/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../grails-partitioned-multi-tenancy/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../grails-schema-per-tenant/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../hibernate5/issue450/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- grails-test-examples/hyphenated/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- grails-test-examples/issue-11102/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- .../build.gradle | 25 +- .../issue-15228/grails-app/conf/application.yml | 58 ++ .../issue-15228/grails-app/conf/logback.xml | 39 ++ .../issue15228/app/AppController.groovy} | 26 +- .../controllers/issue15228/app/UrlMappings.groovy} | 13 +- .../init/issue15228/app}/Application.groovy | 6 +- .../grails-app/views/app/normalView.gson} | 12 +- .../grails-app/views/errors/_errors.gson} | 30 +- .../_otherValidateableObject.gson} | 12 +- .../issue11767/app/GsonViewRespondSpec.groovy | 104 ++++ .../issue15228/app/OtherValidateableObject.groovy} | 14 +- .../issue15228/app/ValidateableObject.groovy} | 14 +- .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 8 +- grails-test-examples/mongodb/base/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../mongodb/database-per-tenant/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../mongodb/gson-templates/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../mongodb/hibernate5/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- grails-test-examples/namespaces/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- grails-test-examples/plugins/exploded/build.gradle | 1 - .../plugins/issue11005/build.gradle | 1 - .../plugins/loadafter/build.gradle | 1 - .../plugins/loadfirst/build.gradle | 1 - .../plugins/loadsecond/build.gradle | 1 - grails-test-examples/scaffolding/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 6 +- .../grails-app/domain/com/example/User.groovy | 15 +- .../domain/com/example/community/User.groovy | 15 +- .../grails-app/init/com/example/Application.groovy | 7 + .../com/example/SpringSecurityAuditorAware.groovy | 50 ++ .../views-functional-tests-plugin/build.gradle | 2 - .../views-functional-tests/build.gradle | 1 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../groovy/functional/tests/BookSpec.groovy | 27 +- .../rest/render/xml/DefaultXmlRendererSpec.groovy | 3 - .../web/converters/JSONConverterTests.groovy | 24 + .../grails/testing/spock/OnceBeforeSpec.groovy | 2 + .../groovy/grails/testing/spock/RunOnceSpec.groovy | 2 + grails-testing-support-web/build.gradle | 1 + .../views/mvc/renderer/DefaultViewRenderer.groovy | 2 +- grails-views-gson/build.gradle | 2 - .../AbstractJsonViewContainerRenderer.groovy | 11 +- grails-views-markup/build.gradle | 2 - .../grails/web/mapping/ResponseRedirector.groovy | 8 +- .../groovy/grails/web/mapping/UrlMappingData.java | 5 + .../grails/web/mapping/DefaultUrlMappingData.java | 24 +- .../org/grails/web/mapping/RegexUrlMapping.java | 9 + .../web/mapping/ResponseCodeMappingData.java | 5 + .../web/mapping/RedirectNonAbsoluteURISpec.groovy | 22 + .../UrlMappingsWithGreedyExtensionSpec.groovy | 230 +++++++ settings.gradle | 2 + 231 files changed, 4193 insertions(+), 1016 deletions(-) diff --cc grails-doc/src/en/guide/introduction/whatsNew.adoc index 54bdb2863d,97287f0a08..20b2ea8712 --- a/grails-doc/src/en/guide/introduction/whatsNew.adoc +++ b/grails-doc/src/en/guide/introduction/whatsNew.adoc @@@ -21,15 -21,76 +21,13 @@@ This section covers all the new feature === Overview - Grails {GrailsVersion} is a major release that includes new features, improvements, and dependency upgrades. -Grails 7 is a major release that includes new features, improvements, and dependency upgrades. ++Grails 8 is a major release that includes new features, improvements, and dependency upgrades. This release focuses on enhancing the developer experience, improving performance, and ensuring compatibility with the latest technologies. -For detailed information on how to upgrade to Grails 7, including major dependency changes, please see the xref:upgrading#upgrading60x[Upgrading from Grails 6 to Grails 7] section. +For detailed information on how to upgrade to Grails 8, including major dependency changes, please see the xref:upgrading#upgrading70x[Upgrading from Grails 7 to Grails 8] section. Notable new features are included below. -=== External Configuration +==== No New Features at this time -The https://github.com/sbglasius/external-config[external configuration plugin] is now integrated into Grails. -See the xref:conf.adoc#externalConfiguration[Configuration] section for details. +No new features at this time -=== Ubiquitous Containerized Browser Testing with Geb - -The https://github.com/apache/grails-core/tree/HEAD/grails-geb#readme[Grails Geb Plugin] has received a significant update, introducing test fixtures that enable ubiquitous containerized browser testing. - -This new approach is now the recommended way to write functional tests in Grails. However, the previous method using WebDriver binaries remains supported for backward compatibility. - -==== Key Features - -By extending your test classes with `ContainerGebSpec`, your tests will automatically leverage a containerized browser provided by https://java.testcontainers.org/[Testcontainers]. This setup eliminates the need for managing browser versions and ensures consistent test environments. - -==== Requirements - -To use `ContainerGebSpec`, ensure that you have a compatible container runtime installed. Supported options include: - -- **Docker Desktop** -- **OrbStack** (macOS only) -- **Rancher Desktop** -- **Podman Desktop** -- **Colima** (macOS and Linux) - -==== How It Works - -Once a compatible container runtime is installed, no additional configuration is needed. Simply extend your test classes with `ContainerGebSpec` (instead of `GebSpec`), and the following will happen: - -1. A container will be started automatically when you run your integration tests. -2. The container will be configured to launch a browser capable of accessing your application under test. - -With this setup, you gain the benefits of containerized testing, such as isolation, reproducibility, and reduced setup complexity. - -==== formActionSubmit tag - -A new tag `formActionSubmit` has been added to replace `actionSubmit`. -Dispatching actions via a parameter name on a form submit will be removed in a future version of grails. -See ticket https://github.com/grails/grails-gsp/issues/551[#551] for details. - -==== @Scaffold support for Controllers and Services - -The `@Scaffold` annotation was added to customize scaffolding generation for controllers and services. - -==== Bootstrap 5.3.3 support - -Bootstrap 5.3.3 support. -Scaffolding and Fields tags now optionally support boostrap classes. - -==== Prioritization of AutoConfiguration over bean overriding. - -The core dependencies of Grails are moving to using `@Configuration` to better integrate with the Spring Boot ecosystem. -Please note that this does mean that some beans are now initialized earlier in the application context lifecycle. - -==== Significant Dependency Removals - -With the removal of Micronaut, and the fixes to the asset pipeline plugin, Grails build sizes should now be significantly reduced. - -==== g:form & CSRF protection - -The `g:form` tag now automatically provides csrf protection when Spring Security CSRF is enabled. -- -==== Grails Banner versions and customization (Grails 7.1+) -- -A Grails banner was introduced in Grails 7 that is displayed on application startup. -From Grails 7.1 onwards, this banner now shows versions of foundational dependencies -and can be xref:conf.adoc#customizing-the-banner[customized].
