This is an automated email from the ASF dual-hosted git repository. jamesfredley pushed a commit to branch 8.0.x in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 6ebc60c6d06b41505598ddb0c44ed129b98ffa65 Merge: fc747cc76a a23982c581 Author: James Fredley <[email protected]> AuthorDate: Thu May 21 16:07:33 2026 -0400 Merge branch '7.2.x' into 8.0.x Conflicts resolved: - NOTICE: kept both Spring Hibernate 5 (HEAD) and Roboto Font (7.2.x) sections - gradle.properties: kept HEAD micronautPlatformVersion=5.0.0-M2, grailsSpringSecurityVersion=8.0.0-SNAPSHOT and the skipMicronautProjects documentation; pulled forward micronautRxjava2Version=2.9.0 and micronautSerdeJacksonVersion=2.11.0 since they are referenced by grails-data-graphql build scripts - settings.gradle: added grails-test-examples-jetty include; micronaut test-example entries remain inside the existing skipMicronautProjects conditional block on 8.0.x - grails-doc/src/en/guide/toc.yml: kept both upgrading80x and upgrading72x - dependencies.gradle: kept HEAD's refactored BOM structure and pulled forward graphql-java, graphql-java-extended-scalars and spring-webmvc-sitemesh entries plus the groovy 4.0.31 -> 4.0.32 bump; kept released starter-sitemesh 3.2.2 instead of 7.2.x's SNAPSHOT - grails-data-graphql/examples/spring-boot-app/build.gradle: accepted deletion; the example moved to grails-test-examples/graphql/spring-boot-app/ - grails-data-graphql/settings.gradle: accepted deletion; the standalone settings is obsolete now that grails-data-graphql is part of the monorepo This merge also pulls forward the GroovyChangeLogSpec fix (commit e32d845db8, "Make capturing Liquibase log output more reliable") that resolves the :grails-data-hibernate5-dbmigration:test failure on 8.0.x CI by routing Liquibase JUL output through jul-to-slf4j so OutputCaptureExtension can observe it. Assisted-by: claude-code:claude-4.7-opus .gitattributes | 53 +++ .github/vote_templates/announce.txt | 4 + .github/vote_templates/staged.txt | 7 - .github/workflows/groovy-joint-workflow.yml | 4 +- .github/workflows/release.yml | 2 + NOTICE | 6 + RELEASE.md | 18 +- RENAME.md | 2 + .../buildsrc/GrailsRepoSettingsPlugin.groovy | 2 + .../main/resources/application.yml => codecov.yml | 27 +- dependencies.gradle | 8 +- etc/bin/Dockerfile | 9 + etc/bin/rename_gradle_artifacts.sh | 2 + etc/bin/verify-cli-distribution.sh | 18 + etc/bin/verify-wrapper-distribution.sh | 19 + etc/bin/verify.sh | 5 + gradle.properties | 2 + gradle/publish-root-config.gradle | 3 + .../reporting/DefaultStackTraceFilterer.java | 56 ++- .../exceptions/reporting/StackTraceFilterer.java | 6 + .../src/main/groovy/grails/config/Settings.groovy | 35 ++ .../reporting/StackTraceFiltererSpec.groovy | 300 ++++++++++---- .../src/main/resources/fonts/archia-bold.eot | Bin 15838 -> 0 bytes .../src/main/resources/fonts/archia-bold.ttf | Bin 41696 -> 0 bytes .../src/main/resources/fonts/archia-bold.woff | Bin 19684 -> 0 bytes .../src/main/resources/fonts/archia-bold.woff2 | Bin 14136 -> 0 bytes .../src/main/resources/fonts/archia-light.eot | Bin 42146 -> 0 bytes .../src/main/resources/fonts/archia-light.ttf | Bin 41864 -> 0 bytes .../src/main/resources/fonts/archia-light.woff | Bin 19908 -> 0 bytes .../src/main/resources/fonts/archia-light.woff2 | Bin 14240 -> 0 bytes .../src/main/resources/fonts/archia-medium.eot | Bin 16471 -> 0 bytes .../src/main/resources/fonts/archia-medium.ttf | Bin 43528 -> 0 bytes .../src/main/resources/fonts/archia-medium.woff | Bin 20436 -> 0 bytes .../src/main/resources/fonts/archia-medium.woff2 | Bin 14484 -> 0 bytes .../src/main/resources/fonts/archia-regular.eot | Bin 15329 -> 0 bytes .../src/main/resources/fonts/archia-regular.ttf | Bin 41328 -> 0 bytes .../src/main/resources/fonts/archia-regular.woff | Bin 19244 -> 0 bytes .../src/main/resources/fonts/archia-regular.woff2 | Bin 13656 -> 0 bytes .../src/main/resources/fonts/archia-semibold.eot | Bin 43510 -> 0 bytes .../src/main/resources/fonts/archia-semibold.ttf | Bin 43216 -> 0 bytes .../src/main/resources/fonts/archia-semibold.woff | Bin 20240 -> 0 bytes .../src/main/resources/fonts/archia-semibold.woff2 | Bin 14460 -> 0 bytes .../src/main/resources/fonts/archia-thin.eot | Bin 15796 -> 0 bytes .../src/main/resources/fonts/archia-thin.ttf | Bin 41700 -> 0 bytes .../src/main/resources/fonts/archia-thin.woff | Bin 19676 -> 0 bytes .../src/main/resources/fonts/archia-thin.woff2 | Bin 14004 -> 0 bytes .../src/main/resources/stylesheets/screen.css | 57 +-- grails-data-graphql/README.md | 35 +- grails-data-graphql/build.gradle | 101 ----- grails-data-graphql/core/build.gradle | 78 ++-- .../groovy/org/grails/gorm/graphql/Schema.groovy | 26 +- .../gorm/graphql/entity/EntityFetchOptions.java | 14 +- .../graphql/entity/dsl/helpers/ComplexTyped.groovy | 7 +- .../gorm/graphql/entity/fields/ComplexField.groovy | 4 +- .../grails/gorm/graphql/entity/fields/Field.groovy | 40 +- .../gorm/graphql/entity/fields/SimpleField.groovy | 34 +- .../entity/operations/CustomOperation.groovy | 5 +- .../graphql/entity/operations/ListOperation.groovy | 1 + .../graphql/entity/operations/OperationType.groovy | 1 + .../graphql/fetcher/BindingGormDataFetcher.groovy | 2 +- .../graphql/fetcher/DefaultGormDataFetcher.groovy | 2 +- .../graphql/fetcher/DeletingGormDataFetcher.groovy | 2 +- .../gorm/graphql/fetcher/GormDataFetcher.groovy | 2 +- .../fetcher/PaginatingGormDataFetcher.groovy | 2 +- .../graphql/fetcher/ReadingGormDataFetcher.groovy | 2 +- .../fetcher/impl/CountEntityDataFetcher.groovy | 2 +- .../fetcher/impl/CreateEntityDataFetcher.groovy | 2 +- .../fetcher/impl/DeleteEntityDataFetcher.groovy | 2 +- .../graphql/fetcher/impl/EntityDataFetcher.groovy | 2 +- .../fetcher/impl/PaginatedEntityDataFetcher.groovy | 2 +- .../fetcher/impl/SingleEntityDataFetcher.groovy | 2 +- .../fetcher/impl/UpdateEntityDataFetcher.groovy | 2 +- .../testing/MockDataFetchingEnvironment.groovy | 16 +- .../graphql/types/DefaultGraphQLTypeManager.groovy | 14 +- .../gorm/graphql/types/GraphQLOperationType.groovy | 1 + .../types/output/AbstractObjectTypeBuilder.groovy | 176 +++++++++ .../output/EmbeddedObjectTypeBuilder.groovy} | 25 +- .../output/ObjectTypeBuilder.groovy} | 15 +- .../types/output/PaginatedObjectTypeBuilder.groovy | 61 +++ .../output/ShowObjectTypeBuilder.groovy} | 23 +- .../graphql/types/scalars/CustomScalars.groovy | 11 +- ...Spec.groovy => MongoSchemaSpec.groovy.disabled} | 0 .../HibernatePersistentGraphQLPropertySpec.groovy | 4 +- .../DefaultGraphQLDomainPropertyManagerSpec.groovy | 14 +- .../EmbeddedInputObjectTypeBuilderSpec.groovy | 4 +- .../output/EmbeddedObjectTypeBuilderSpec.groovy | 105 +++++ .../types/output/ShowObjectTypeBuilderSpec.groovy | 106 +++++ grails-data-graphql/docs/build.gradle | 52 ++- .../docs/src/main/docs/guide/types.adoc | 2 +- grails-data-graphql/docs/src/main/docs/index.adoc | 107 +++++ .../examples/grails-docs-app/build.gradle | 60 --- .../grails-multi-datastore-app/build.gradle | 72 ---- .../examples/grails-tenant-app/build.gradle | 66 ---- .../examples/grails-test-app/build.gradle | 63 --- .../examples/spring-boot-app/build.gradle | 68 ---- .../com/example/demo/AuthorIntegrationTests.groovy | 46 --- grails-data-graphql/gradle.properties | 52 --- grails-data-graphql/plugin/build.gradle | 110 ++++-- .../gorm/graphql/plugin/GraphqlController.groovy | 12 +- .../init/gorm/graphql/Application.groovy | 3 +- .../graphql/plugin/GormGraphqlGrailsPlugin.groovy | 107 ++--- .../plugin/GrailsGraphQLConfiguration.groovy | 13 +- .../graphql/plugin/GraphQLContextBuilder.groovy | 2 +- .../gorm/graphql/plugin/GraphQLRequest.groovy | 6 +- .../gorm/graphql/plugin/testing/GraphQLSpec.groovy | 2 +- .../gorm/graphql/GraphqlControllerSpec.groovy | 7 +- grails-data-graphql/settings.gradle | 75 ---- grails-data-hibernate5/dbmigration/build.gradle | 8 + .../src/test/resources/logging.properties | 6 +- .../bson/codecs/encoders/IdentityEncoder.groovy | 48 +++ .../mapping/mongo/MongoCodecSession.groovy | 24 +- .../mapping/mongo/config/MongoMappingContext.java | 55 ++- .../mapping/mongo/config/MongoSettings.groovy | 14 + .../AbstractMongoConnectionSourceSettings.groovy | 11 + .../mongo/connections/StringIdSettings.groovy | 30 +- .../mongo/engine/MongoCodecEntityPersister.groovy | 25 +- .../mapping/mongo/engine/MongoIdCoercion.java | 93 +++++ .../engine/codecs/PersistentEntityCodec.groovy | 35 +- .../datastore/mapping/mongo/query/MongoQuery.java | 54 ++- .../SingleEmbeddedAssignNullToNonNullSpec.groovy | 146 +++++++ .../bugs/StringIdDefaultStoredAsConfigSpec.groovy | 132 +++++++ .../bugs/StringIdWithObjectIdStorageSpec.groovy | 432 +++++++++++++++++++++ .../asciidoc/gettingStarted/advancedConfig.adoc | 2 + .../docs/asciidoc/objectMapping/idGeneration.adoc | 63 ++- .../core/grailsversion/GrailsVersionSpec.groovy | 2 +- .../datastore/mapping/config/Property.groovy | 14 + .../datastore/mapping/model/IdentityMapping.java | 15 + .../datastore/mapping/model/MappingFactory.java | 21 +- .../config/logging/loggingFullStackTraces.adoc | 212 ++++++++++ grails-doc/src/en/guide/index.adoc | 5 + .../src/en/guide/theWebLayer/gsp/layouts.adoc | 25 +- grails-doc/src/en/guide/toc.yml | 2 + .../src/en/guide/upgrading/upgrading71x.adoc | 56 +++ .../src/en/guide/upgrading/upgrading72x.adoc | 102 +++++ .../grails/forge/feature/database/GraphqlGorm.java | 95 +++++ .../forge/feature/database/GraphqlGormSpec.groovy | 106 +++++ grails-gsp/grails-sitemesh3/build.gradle | 54 +-- .../sitemesh3/GrailsLayoutHandlerMapping.java | 68 ---- .../plugins/sitemesh3/Sitemesh3GrailsPlugin.groovy | 79 ++-- .../plugins/sitemesh3/Sitemesh3LayoutTagLib.groovy | 262 +++++++++++++ .../plugins/web/taglib/RenderSitemeshTagLib.groovy | 136 ++++--- .../sitemesh3/CaptureAwareContentProcessor.java | 99 +++++ .../plugins/sitemesh3/GrailsSiteMeshView.java | 85 ++++ .../sitemesh3/GrailsSiteMeshViewContext.java | 103 +++++ .../sitemesh3/GrailsSiteMeshViewResolver.java | 57 +++ ...railsSiteMeshViewResolverBeanPostProcessor.java | 45 +++ .../sitemesh3/Sitemesh3AutoConfiguration.java | 49 +++ .../plugins/sitemesh3/Sitemesh3CapturedPage.java | 370 ++++++++++++++++++ .../Sitemesh3EnvironmentPostProcessor.java | 70 ++++ .../plugins/sitemesh3/Sitemesh3LayoutFinder.java | 263 +++++++++++++ .../src/main/resources/META-INF/spring.factories | 2 + ...rk.boot.autoconfigure.AutoConfiguration.imports | 1 + ...ework.boot.env.EnvironmentPostProcessor.imports | 1 + .../CaptureAwareContentProcessorSpec.groovy | 134 +++++++ .../sitemesh3/GrailsSiteMeshViewContextSpec.groovy | 91 +++++ ...iteMeshViewResolverBeanPostProcessorSpec.groovy | 71 ++++ .../GrailsSiteMeshViewResolverSpec.groovy | 89 +++++ .../Sitemesh3EnvironmentPostProcessorSpec.groovy | 71 ++++ .../sitemesh3/Sitemesh3LayoutFinderSpec.groovy | 199 ++++++++++ .../java/grails/gsp/boot/GspAutoConfiguration.java | 10 - .../graphql/grails-docs-app/build.gradle | 74 ++++ .../grails-app/conf/application.yml | 0 .../grails-docs-app/grails-app/conf/logback.xml | 0 .../grails-app/conf/spring/resources.groovy | 0 .../grails/docs/app/ApplicationController.groovy | 0 .../controllers/grails/docs/app/UrlMappings.groovy | 0 .../grails-app/domain/demo/Author.groovy | 0 .../grails-app/domain/demo/Book.groovy | 0 .../grails-app/domain/demo/Speaker.groovy | 0 .../grails-app/domain/demo/Talk.groovy | 0 .../grails-app/i18n/messages.properties | 0 .../grails-app/i18n/messages_cs_CZ.properties | 0 .../grails-app/i18n/messages_da.properties | 0 .../grails-app/i18n/messages_de.properties | 0 .../grails-app/i18n/messages_es.properties | 0 .../grails-app/i18n/messages_fr.properties | 0 .../grails-app/i18n/messages_it.properties | 0 .../grails-app/i18n/messages_ja.properties | 0 .../grails-app/i18n/messages_nb.properties | 0 .../grails-app/i18n/messages_nl.properties | 0 .../grails-app/i18n/messages_pl.properties | 0 .../grails-app/i18n/messages_pt_BR.properties | 0 .../grails-app/i18n/messages_pt_PT.properties | 0 .../grails-app/i18n/messages_ru.properties | 0 .../grails-app/i18n/messages_sv.properties | 0 .../grails-app/i18n/messages_th.properties | 0 .../grails-app/i18n/messages_zh_CN.properties | 0 .../init/grails/docs/app/Application.groovy | 0 .../init/grails/docs/app/BootStrap.groovy | 0 .../grails-app/services/demo/SpeakerService.groovy | 0 .../grails-app/views/application/index.gson | 0 .../grails-docs-app/grails-app/views/error.gson | 0 .../grails-app/views/errors/_errors.gson | 0 .../grails-docs-app/grails-app/views/notFound.gson | 0 .../grails-app/views/object/_object.gson | 0 .../groovy/demo/AuthorIntegrationSpec.groovy | 0 .../groovy/demo/SpeakerIntegrationSpec.groovy | 0 .../src/main/groovy/demo/AuthorDataBinder.groovy | 0 .../src/main/groovy/demo/GraphQLCustomizer.groovy | 0 .../grails-multi-datastore-app/build.gradle | 78 ++++ .../grails-app/conf/application.yml | 0 .../grails-app/conf/logback.groovy | 0 .../grails-app/conf/spring/resources.groovy | 0 .../controllers/myapp/ApplicationController.groovy | 0 .../controllers/myapp/UrlMappings.groovy | 0 .../grails-app/domain/myapp/Bar.groovy | 0 .../grails-app/domain/myapp/Foo.groovy | 0 .../grails-app/i18n/messages.properties | 0 .../grails-app/i18n/messages_cs_CZ.properties | 0 .../grails-app/i18n/messages_da.properties | 0 .../grails-app/i18n/messages_de.properties | 0 .../grails-app/i18n/messages_es.properties | 0 .../grails-app/i18n/messages_fr.properties | 0 .../grails-app/i18n/messages_it.properties | 0 .../grails-app/i18n/messages_ja.properties | 0 .../grails-app/i18n/messages_nb.properties | 0 .../grails-app/i18n/messages_nl.properties | 0 .../grails-app/i18n/messages_pl.properties | 0 .../grails-app/i18n/messages_pt_BR.properties | 0 .../grails-app/i18n/messages_pt_PT.properties | 0 .../grails-app/i18n/messages_ru.properties | 0 .../grails-app/i18n/messages_sv.properties | 0 .../grails-app/i18n/messages_th.properties | 0 .../grails-app/i18n/messages_zh_CN.properties | 0 .../grails-app/init/myapp/Application.groovy | 0 .../grails-app/init/myapp/BootStrap.groovy | 0 .../grails-app/views/application/index.gson | 0 .../grails-app/views/error.gson | 0 .../grails-app/views/errors/_errors.gson | 0 .../grails-app/views/notFound.gson | 0 .../grails-app/views/object/_object.gson | 0 .../groovy/myapp/BarIntegrationSpec.groovy | 2 +- .../groovy/myapp/FooIntegrationSpec.groovy | 2 +- .../main/groovy/myapp/MyGraphQLCustomizer.groovy | 0 .../main/groovy/myapp/ObjectIdJsonConverter.groovy | 0 ...ils.plugin.json.builder.JsonGenerator$Converter | 0 .../graphql/grails-tenant-app/build.gradle | 74 ++++ .../grails-app/conf/application.yml | 0 .../grails-tenant-app/grails-app/conf/logback.xml | 0 .../grails-app/conf/spring/resources.groovy | 0 .../grails/tenant/app/ApplicationController.groovy | 0 .../grails/tenant/app/UrlMappings.groovy | 0 .../domain/grails/tenant/app/User.groovy | 2 + .../grails-app/i18n/messages.properties | 0 .../grails-app/i18n/messages_cs_CZ.properties | 0 .../grails-app/i18n/messages_da.properties | 0 .../grails-app/i18n/messages_de.properties | 0 .../grails-app/i18n/messages_es.properties | 0 .../grails-app/i18n/messages_fr.properties | 0 .../grails-app/i18n/messages_it.properties | 0 .../grails-app/i18n/messages_ja.properties | 0 .../grails-app/i18n/messages_nb.properties | 0 .../grails-app/i18n/messages_nl.properties | 0 .../grails-app/i18n/messages_pl.properties | 0 .../grails-app/i18n/messages_pt_BR.properties | 0 .../grails-app/i18n/messages_pt_PT.properties | 0 .../grails-app/i18n/messages_ru.properties | 0 .../grails-app/i18n/messages_sv.properties | 0 .../grails-app/i18n/messages_th.properties | 0 .../grails-app/i18n/messages_zh_CN.properties | 0 .../init/grails/tenant/app/Application.groovy | 0 .../init/grails/tenant/app/BootStrap.groovy | 0 .../grails-app/views/application/index.gson | 0 .../grails-tenant-app/grails-app/views/error.gson | 0 .../grails-app/views/errors/_errors.gson | 0 .../grails-app/views/notFound.gson | 0 .../grails-app/views/object/_object.gson | 0 .../grails/tenant/app/UserIntegrationSpec.groovy | 0 .../tenant/app/GraphqlMultiTenantSpec.groovy | 0 .../graphql/grails-test-app/build.gradle | 75 ++++ .../grails-app/conf/application.yml | 0 .../grails-test-app/grails-app/conf/logback.xml | 0 .../grails-app/conf/spring/resources.groovy | 0 .../grails/test/app/ApplicationController.groovy | 0 .../controllers/grails/test/app/UrlMappings.groovy | 0 .../domain/grails/test/app/Address.groovy | 0 .../domain/grails/test/app/ArguedField.groovy | 0 .../domain/grails/test/app/Artist.groovy | 0 .../domain/grails/test/app/Author.groovy | 0 .../grails-app/domain/grails/test/app/Book.groovy | 0 .../domain/grails/test/app/Comment.groovy | 0 .../grails/test/app/CreditCardPayment.groovy | 0 .../domain/grails/test/app/GrailsTeamMember.groovy | 0 .../domain/grails/test/app/NumberLength.groovy | 0 .../domain/grails/test/app/Payment.groovy | 0 .../grails-app/domain/grails/test/app/Post.groovy | 0 .../domain/grails/test/app/Restricted.groovy | 0 .../grails-app/domain/grails/test/app/Role.groovy | 0 .../domain/grails/test/app/SimpleComposite.groovy | 0 .../domain/grails/test/app/SoftDelete.groovy | 0 .../grails-app/domain/grails/test/app/Tag.groovy | 0 .../domain/grails/test/app/TypeTest.groovy | 0 .../domain/grails/test/app/UnsupportedType.groovy | 0 .../grails-app/domain/grails/test/app/User.groovy | 5 + .../domain/grails/test/app/UserRole.groovy | 0 .../domain/grails/test/app/inheritance/Dog.groovy | 0 .../grails/test/app/inheritance/Human.groovy | 0 .../grails/test/app/inheritance/Labradoodle.groovy | 0 .../grails/test/app/inheritance/LandMammal.groovy | 0 .../grails/test/app/inheritance/Mammal.groovy | 0 .../grails/test/app/manyToMany/Classes.groovy | 0 .../grails/test/app/manyToMany/Student.groovy | 0 .../grails-app/i18n/messages.properties | 0 .../grails-app/i18n/messages_cs_CZ.properties | 0 .../grails-app/i18n/messages_da.properties | 0 .../grails-app/i18n/messages_de.properties | 0 .../grails-app/i18n/messages_es.properties | 0 .../grails-app/i18n/messages_fr.properties | 0 .../grails-app/i18n/messages_it.properties | 0 .../grails-app/i18n/messages_ja.properties | 0 .../grails-app/i18n/messages_nb.properties | 0 .../grails-app/i18n/messages_nl.properties | 0 .../grails-app/i18n/messages_pl.properties | 0 .../grails-app/i18n/messages_pt_BR.properties | 0 .../grails-app/i18n/messages_pt_PT.properties | 0 .../grails-app/i18n/messages_ru.properties | 0 .../grails-app/i18n/messages_sv.properties | 0 .../grails-app/i18n/messages_th.properties | 0 .../grails-app/i18n/messages_zh_CN.properties | 0 .../init/grails/test/app/Application.groovy | 0 .../init/grails/test/app/BootStrap.groovy | 0 .../services/grails/test/app/DogService.groovy | 0 .../grails/test/app/GrailsTeamMemberService.groovy | 0 .../services/grails/test/app/HumanService.groovy | 0 .../grails/test/app/LabradoodleService.groovy | 0 .../grails-app/views/application/index.gson | 0 .../grails-test-app/grails-app/views/error.gson | 0 .../grails-app/views/errors/_errors.gson | 0 .../grails-test-app/grails-app/views/notFound.gson | 0 .../grails-app/views/object/_object.gson | 0 .../test/app/ArguedFieldIntegrationSpec.groovy | 0 .../grails/test/app/ArtistIntegrationSpec.groovy | 0 .../grails/test/app/AuthorIntegrationSpec.groovy | 0 .../grails/test/app/BookIntegrationSpec.groovy | 0 .../grails/test/app/CommentIntegrationSpec.groovy | 6 +- .../app/GrailsTeamMemberIntegrationSpec.groovy | 0 .../test/app/InheritanceIntegrationSpec.groovy | 0 .../test/app/NumberLengthIntegrationSpec.groovy | 0 .../grails/test/app/PaymentIntegrationSpec.groovy | 0 .../grails/test/app/PostIntegrationSpec.groovy | 21 +- .../test/app/RestrictedIntegrationSpec.groovy | 0 .../test/app/SimpleCompositeIntegrationSpec.groovy | 0 .../test/app/SoftDeleteIntegrationSpec.groovy | 0 .../grails/test/app/TagIntegrationSpec.groovy | 17 +- .../grails/test/app/TypeTestIntegrationSpec.groovy | 0 .../grails/test/app/UserIntegrationSpec.groovy | 0 .../grails/test/app/UserRoleIntegrationSpec.groovy | 4 +- .../grails/test/app/GraphQLCustomizer.groovy | 0 .../test/app/RevokeAllRolesDataFetcher.groovy | 0 .../groovy/grails/test/app/RoleDataBinder.groovy | 0 .../groovy/grails/test/app/UserDataBinder.groovy | 0 .../grails/test/app/UsersByRoleDataFetcher.groovy | 0 .../groovy/grails/test/app/pogo/Painting.groovy | 0 .../groovy/grails/test/app/pogo/Profile.groovy | 0 .../test/app/manyToMany/StudentSchemaSpec.groovy | 0 .../graphql/spring-boot-app/build.gradle | 73 ++++ .../groovy/com/example/demo/DemoApplication.groovy | 0 .../demo/controllers/GraphQLController.groovy | 0 .../groovy/com/example/demo/domains/Author.groovy | 15 +- .../src/main/resources/application.yml | 0 .../com/example/demo/AuthorIntegrationTests.groovy | 56 +++ .../com/example/demo/DemoApplicationTests.groovy | 15 +- grails-test-examples/gsp-sitemesh3/build.gradle | 1 + .../grails/layout/EndToEndController.groovy | 14 + .../integration-test/groovy/EndToEndSpec.groovy | 28 +- grails-test-examples/issue-10279/build.gradle | 48 +++ .../issue-10279/grails-app/conf/application.groovy | 26 ++ .../issue-10279/grails-app/conf}/application.yml | 32 +- .../issue-10279}/grails-app/conf/logback.xml | 6 +- .../controllers/issue10279/UrlMappings.groovy | 25 ++ .../grails-app/init/issue10279/Application.groovy | 28 ++ .../issue10279/ActuatorEnvClosureSpec.groovy | 56 +++ .../{gsp-sitemesh3 => jetty}/build.gradle | 35 +- .../grails-app/assets/javascripts/application.js | 16 + .../grails-app/assets/stylesheets/application.css | 18 + .../jetty/grails-app/conf/application.yml | 60 +++ .../jetty/grails-app/conf/logback-spring.xml | 23 +- .../jetty}/grails-app/conf/spring/resources.groovy | 0 .../issue12688/SessionController.groovy | 21 +- .../controllers/issue12688/UrlMappings.groovy | 22 +- .../grails-app/init/issue12688}/Application.groovy | 4 +- .../grails-app/init/issue12688/BootStrap.groovy | 10 +- .../jetty/grails-app/views/error.gsp | 29 ++ .../jetty/grails-app/views/index.gsp | 28 ++ .../jetty/grails-app/views/notFound.gsp | 28 ++ .../jetty/grails-app/views/session/index.gsp | 30 ++ .../jetty/grails-app/views/session/show.gsp | 27 ++ .../groovy/issue12688/JettySessionSpec.groovy | 51 +++ .../groovy/issue12688/pages/SessionFormPage.groovy | 15 +- .../groovy/issue12688/pages/SessionShowPage.groovy | 18 +- .../org/grails/web/errors/AuditorAwareLookup.java | 101 +++++ .../grails/web/errors/GrailsExceptionResolver.java | 116 ++++++ .../web/errors/GrailsExceptionResolverSpec.groovy | 263 ++++++++++++- .../mvc/AbstractGrailsControllerUrlMappings.groovy | 22 +- .../mvc/WildcardActionValidationSpec.groovy | 30 ++ settings.gradle | 33 ++ 396 files changed, 7186 insertions(+), 1356 deletions(-) diff --cc .github/workflows/groovy-joint-workflow.yml index 6949e938c4,7d79648002..6ad2ec94f3 --- a/.github/workflows/groovy-joint-workflow.yml +++ b/.github/workflows/groovy-joint-workflow.yml @@@ -38,10 -38,10 +38,10 @@@ jobs - name: "☕️ Setup JDK" uses: actions/setup-java@v4 with: - java-version: 17 + java-version: 21 distribution: liberica - name: "🗄️ Cache local Maven repository" - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: cache-local-maven-${{ github.sha }} diff --cc NOTICE index 5a32f68c21,cd31fd4799..d026681e85 --- a/NOTICE +++ b/NOTICE @@@ -24,8 -24,8 +24,14 @@@ http://www.oracle.com/webfolder/technet This product includes software developed by the OpenSymphony Group (http://www.opensymphony.com/). It uses Sitemesh2, licensed under the OpenSymphony Software License, Version 1.1. See licenses/LICENSE-opensymphony.txt for the full license terms. +Spring Framework ORM Hibernate 5 Support +This product includes software from the Spring Framework project (https://spring.io/projects/spring-framework), +vendored from Spring Framework 6.2.x. These classes were removed in Spring Framework 7.0. +Copyright 2002-2024 the original author or authors. +Licensed under the Apache License, Version 2.0. ++ + Roboto Font + This product bundles the Roboto font (https://fonts.google.com/specimen/Roboto), used by the + GORM documentation website under grails-data-docs/data-mapping-website/. + Font data copyright Google 2012. -Licensed under the Apache License, Version 2.0. ++Licensed under the Apache License, Version 2.0. diff --cc dependencies.gradle index 4ef92dbf9f,400ea37eaf..c8a9096511 --- a/dependencies.gradle +++ b/dependencies.gradle @@@ -72,30 -67,32 +72,33 @@@ ext ] bomDependencyVersions = [ - 'asset-pipeline-bom.version' : '5.0.34', + 'asset-pipeline-bom.version' : '5.1.0-M4', 'bootstrap-icons.version' : '1.13.1', 'bootstrap.version' : '5.3.8', - 'commons-codec.version' : '1.18.0', + 'commons-codec.version' : '1.21.0', 'commons-lang3.version' : '3.20.0', 'geb-spock.version' : '8.0.1', - 'groovy.version' : '4.0.31', + 'graphql-java.version' : '24.3', + 'graphql-java-extended-scalars.version': '24.0', + 'groovy.version' : '4.0.32', - 'jackson.version' : '2.21.2', - 'jquery.version' : '3.7.1', 'hibernate-groovy-proxy.version': '1.1', 'jakarta-servlet-api.version' : '6.1.0', - 'jakarta-validation-api.version': '3.1.1', - 'junit.version' : '5.13.3', - 'junit-platform.version' : '1.13.3', - 'mongodb.version' : '5.5.2', - 'opentelemetry.version' : '1.55.0', + 'jakarta-validation.version': '3.1.1', + 'jquery.version' : '3.7.1', + 'junit.version' : '6.0.3', + 'mongodb.version' : '5.6.4', 'rxjava.version' : '1.3.8', 'rxjava2.version' : '2.2.21', 'rxjava3.version' : '3.1.12', 'selenium.version' : '4.38.0', - 'spock.version' : '2.3-groovy-4.0', 'sitemesh.version' : '2.6.0', - 'starter-sitemesh.version' : '3.2.3-SNAPSHOT', - 'spring-webmvc-sitemesh.version': '3.2.3-SNAPSHOT', + 'spock.version' : '2.3-groovy-4.0', + 'starter-sitemesh.version' : '3.2.2', ++ 'spring-webmvc-sitemesh.version': '3.2.2', + // Spring Boot 4 no longer manages spring-retry; pin it here so the + // grails-shell-cli SpringRetryCompilerAutoConfiguration's unversioned + // reference resolves and consumer apps using @Retryable get a known version. + 'spring-retry.version' : '2.0.11', ] // Note: the name of the dependency must be the prefix of the property name so properties in the pom are resolved correctly @@@ -109,70 -107,87 +112,73 @@@ // Note: the name of the dependency must be the prefix of the property name so properties in the pom are resolved correctly bomDependencies = [ - 'bootstrap' : "org.webjars.npm:bootstrap:${bomDependencyVersions['bootstrap.version']}", - 'bootstrap-icons' : "org.webjars.npm:bootstrap-icons:${bomDependencyVersions['bootstrap-icons.version']}", - 'commons-codec' : "commons-codec:commons-codec:${bomDependencyVersions['commons-codec.version']}", - 'commons-lang3' : "org.apache.commons:commons-lang3:${bomDependencyVersions['commons-lang3.version']}", - 'geb-spock' : "org.apache.groovy.geb:geb-spock:${bomDependencyVersions['geb-spock.version']}", - 'graphql-java' : "com.graphql-java:graphql-java:${bomDependencyVersions['graphql-java.version']}", + 'bootstrap' : "org.webjars.npm:bootstrap:${bomDependencyVersions['bootstrap.version']}", + 'bootstrap-icons' : "org.webjars.npm:bootstrap-icons:${bomDependencyVersions['bootstrap-icons.version']}", + 'byte-buddy-agent' : "net.bytebuddy:byte-buddy-agent:${gradleBomDependencyVersions['byte-buddy.version']}", + 'commons-codec' : "commons-codec:commons-codec:${bomDependencyVersions['commons-codec.version']}", + 'commons-lang3' : "org.apache.commons:commons-lang3:${bomDependencyVersions['commons-lang3.version']}", + 'geb-spock' : "org.apache.groovy.geb:geb-spock:${bomDependencyVersions['geb-spock.version']}", ++ 'graphql-java' : "com.graphql-java:graphql-java:${bomDependencyVersions['graphql-java.version']}", + 'graphql-java-extended-scalars': "com.graphql-java:graphql-java-extended-scalars:${bomDependencyVersions['graphql-java-extended-scalars.version']}", - // start - restate the groovy-bom includes here because the spring dependency management will pick the library from spring-boot-dependencies otherwise - 'groovy' : "org.apache.groovy:groovy:${bomDependencyVersions['groovy.version']}", - 'groovy-ant' : "org.apache.groovy:groovy-ant:${bomDependencyVersions['groovy.version']}", - 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${bomDependencyVersions['groovy.version']}", - 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${bomDependencyVersions['groovy.version']}", - 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${bomDependencyVersions['groovy.version']}", - 'groovy-console' : "org.apache.groovy:groovy-console:${bomDependencyVersions['groovy.version']}", - 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${bomDependencyVersions['groovy.version']}", - 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${bomDependencyVersions['groovy.version']}", - 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${bomDependencyVersions['groovy.version']}", - 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${bomDependencyVersions['groovy.version']}", - 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${bomDependencyVersions['groovy.version']}", - 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${bomDependencyVersions['groovy.version']}", - 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${bomDependencyVersions['groovy.version']}", - 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${bomDependencyVersions['groovy.version']}", - 'groovy-json' : "org.apache.groovy:groovy-json:${bomDependencyVersions['groovy.version']}", - 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${bomDependencyVersions['groovy.version']}", - 'groovy-macro' : "org.apache.groovy:groovy-macro:${bomDependencyVersions['groovy.version']}", - 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${bomDependencyVersions['groovy.version']}", - 'groovy-nio' : "org.apache.groovy:groovy-nio:${bomDependencyVersions['groovy.version']}", - 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${bomDependencyVersions['groovy.version']}", - 'groovy-sql' : "org.apache.groovy:groovy-sql:${bomDependencyVersions['groovy.version']}", - 'groovy-swing' : "org.apache.groovy:groovy-swing:${bomDependencyVersions['groovy.version']}", - 'groovy-templates' : "org.apache.groovy:groovy-templates:${bomDependencyVersions['groovy.version']}", - 'groovy-test' : "org.apache.groovy:groovy-test:${bomDependencyVersions['groovy.version']}", - 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${bomDependencyVersions['groovy.version']}", - 'groovy-testng' : "org.apache.groovy:groovy-testng:${bomDependencyVersions['groovy.version']}", - 'groovy-toml' : "org.apache.groovy:groovy-toml:${bomDependencyVersions['groovy.version']}", - 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${bomDependencyVersions['groovy.version']}", - 'groovy-xml' : "org.apache.groovy:groovy-xml:${bomDependencyVersions['groovy.version']}", - 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${bomDependencyVersions['groovy.version']}", - // end - restate the groovy-bom here because the spring dependency management - 'jquery' : "org.webjars.npm:jquery:${bomDependencyVersions['jquery.version']}", - // start - boot & selenium conflict, so pin the version we want (newest) - 'jakarta-servlet-api' : "jakarta.servlet:jakarta.servlet-api:${bomDependencyVersions['jakarta-servlet-api.version']}", - 'jakarta-validation-api' : "jakarta.validation:jakarta.validation-api:${bomDependencyVersions['jakarta-validation-api.version']}", - // end - boot & selenium conflict, so pin the version we want (newest) - // start - boot & spock conflict, so pin the version we want (newest) - 'junit-jupiter' : "org.junit.jupiter:junit-jupiter:${bomDependencyVersions['junit.version']}", - 'junit-jupiter-api' : "org.junit.jupiter:junit-jupiter-api:${bomDependencyVersions['junit.version']}", - 'junit-jupiter-engine' : "org.junit.jupiter:junit-jupiter-engine:${bomDependencyVersions['junit.version']}", - 'junit-jupiter-params' : "org.junit.jupiter:junit-jupiter-params:${bomDependencyVersions['junit.version']}", - 'junit-platform-commons' : "org.junit.platform:junit-platform-commons:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-engine' : "org.junit.platform:junit-platform-engine:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-launcher' : "org.junit.platform:junit-platform-launcher:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-runner' : "org.junit.platform:junit-platform-runner:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-suite' : "org.junit.platform:junit-platform-suite:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-suite-api' : "org.junit.platform:junit-platform-suite-api:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-suite-commons': "org.junit.platform:junit-platform-suite-commons:${bomDependencyVersions['junit-platform.version']}", - 'junit-platform-suite-engine' : "org.junit.platform:junit-platform-suite-engine:${bomDependencyVersions['junit-platform.version']}", - // end - boot & spock conflict, so pin the version we want (newest) + 'groovy' : "org.apache.groovy:groovy:${bomDependencyVersions['groovy.version']}", + 'groovy-ant' : "org.apache.groovy:groovy-ant:${bomDependencyVersions['groovy.version']}", + 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${bomDependencyVersions['groovy.version']}", + 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${bomDependencyVersions['groovy.version']}", + 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${bomDependencyVersions['groovy.version']}", + 'groovy-console' : "org.apache.groovy:groovy-console:${bomDependencyVersions['groovy.version']}", + 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${bomDependencyVersions['groovy.version']}", + 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${bomDependencyVersions['groovy.version']}", + 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${bomDependencyVersions['groovy.version']}", + 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${bomDependencyVersions['groovy.version']}", + 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${bomDependencyVersions['groovy.version']}", + 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${bomDependencyVersions['groovy.version']}", + 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${bomDependencyVersions['groovy.version']}", + 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${bomDependencyVersions['groovy.version']}", + 'groovy-json' : "org.apache.groovy:groovy-json:${bomDependencyVersions['groovy.version']}", + 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${bomDependencyVersions['groovy.version']}", + 'groovy-macro' : "org.apache.groovy:groovy-macro:${bomDependencyVersions['groovy.version']}", + 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${bomDependencyVersions['groovy.version']}", + 'groovy-nio' : "org.apache.groovy:groovy-nio:${bomDependencyVersions['groovy.version']}", + 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${bomDependencyVersions['groovy.version']}", + 'groovy-sql' : "org.apache.groovy:groovy-sql:${bomDependencyVersions['groovy.version']}", + 'groovy-swing' : "org.apache.groovy:groovy-swing:${bomDependencyVersions['groovy.version']}", + 'groovy-templates' : "org.apache.groovy:groovy-templates:${bomDependencyVersions['groovy.version']}", + 'groovy-test' : "org.apache.groovy:groovy-test:${bomDependencyVersions['groovy.version']}", + 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${bomDependencyVersions['groovy.version']}", + 'groovy-testng' : "org.apache.groovy:groovy-testng:${bomDependencyVersions['groovy.version']}", + 'groovy-toml' : "org.apache.groovy:groovy-toml:${bomDependencyVersions['groovy.version']}", + 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${bomDependencyVersions['groovy.version']}", + 'groovy-xml' : "org.apache.groovy:groovy-xml:${bomDependencyVersions['groovy.version']}", + 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${bomDependencyVersions['groovy.version']}", 'hibernate-groovy-proxy' : "org.yakworks:hibernate-groovy-proxy:${bomDependencyVersions['hibernate-groovy-proxy.version']}", - 'mongodb-bson' : "org.mongodb:bson:${bomDependencyVersions['mongodb.version']}", - 'mongodb-driver-core' : "org.mongodb:mongodb-driver-core:${bomDependencyVersions['mongodb.version']}", - 'mongodb-driver-sync' : "org.mongodb:mongodb-driver-sync:${bomDependencyVersions['mongodb.version']}", - 'mongodb-record-codec' : "org.mongodb:bson-record-codec:${bomDependencyVersions['mongodb.version']}", - // start - pin opentelemetry to prevent bom conflicts - 'opentelemetry-api' : "io.opentelemetry:opentelemetry-api:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-context' : "io.opentelemetry:opentelemetry-context:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-exporter-logging' : "io.opentelemetry:opentelemetry-exporter-logging:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk' : "io.opentelemetry:opentelemetry-sdk:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-common' : "io.opentelemetry:opentelemetry-sdk-common:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-trace' : "io.opentelemetry:opentelemetry-sdk-trace:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-metrics' : "io.opentelemetry:opentelemetry-sdk-metrics:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-logs' : "io.opentelemetry:opentelemetry-sdk-logs:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-extension-autoconfigure-spi' : "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:${bomDependencyVersions['opentelemetry.version']}", - 'opentelemetry-sdk-extension-autoconfigure' : "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${bomDependencyVersions['opentelemetry.version']}", - // end - pin opentelemetry to prevent bom conflicts - 'rxjava' : "io.reactivex:rxjava:${bomDependencyVersions['rxjava.version']}", - 'rxjava2' : "io.reactivex.rxjava2:rxjava:${bomDependencyVersions['rxjava2.version']}", - 'rxjava3' : "io.reactivex.rxjava3:rxjava:${bomDependencyVersions['rxjava3.version']}", - 'sitemesh' : "opensymphony:sitemesh:${bomDependencyVersions['sitemesh.version']}", - 'starter-sitemesh' : "org.sitemesh:spring-boot-starter-sitemesh:${bomDependencyVersions['starter-sitemesh.version']}", - 'spring-webmvc-sitemesh' : "org.sitemesh:spring-webmvc-sitemesh:${bomDependencyVersions['spring-webmvc-sitemesh.version']}", + 'jakarta-servlet-api' : "jakarta.servlet:jakarta.servlet-api:${bomDependencyVersions['jakarta-servlet-api.version']}", + 'jakarta-validation' : "jakarta.validation:jakarta.validation-api:${bomDependencyVersions['jakarta-validation.version']}", + 'jquery' : "org.webjars.npm:jquery:${bomDependencyVersions['jquery.version']}", + 'junit-jupiter' : "org.junit.jupiter:junit-jupiter:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-jupiter-api' : "org.junit.jupiter:junit-jupiter-api:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-jupiter-engine' : "org.junit.jupiter:junit-jupiter-engine:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-jupiter-params' : "org.junit.jupiter:junit-jupiter-params:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-commons' : "org.junit.platform:junit-platform-commons:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-engine' : "org.junit.platform:junit-platform-engine:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-launcher' : "org.junit.platform:junit-platform-launcher:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-runner' : "org.junit.platform:junit-platform-runner:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-suite' : "org.junit.platform:junit-platform-suite:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-suite-api' : "org.junit.platform:junit-platform-suite-api:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-suite-commons': "org.junit.platform:junit-platform-suite-commons:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'junit-platform-suite-engine' : "org.junit.platform:junit-platform-suite-engine:${bomDependencyVersions['junit.version']}", // boot & spock conflict + 'mongodb-bson' : "org.mongodb:bson:${bomDependencyVersions['mongodb.version']}", + 'mongodb-driver-core' : "org.mongodb:mongodb-driver-core:${bomDependencyVersions['mongodb.version']}", + 'mongodb-driver-sync' : "org.mongodb:mongodb-driver-sync:${bomDependencyVersions['mongodb.version']}", + 'mongodb-record-codec' : "org.mongodb:bson-record-codec:${bomDependencyVersions['mongodb.version']}", + 'rxjava' : "io.reactivex:rxjava:${bomDependencyVersions['rxjava.version']}", + 'rxjava2' : "io.reactivex.rxjava2:rxjava:${bomDependencyVersions['rxjava2.version']}", + 'rxjava3' : "io.reactivex.rxjava3:rxjava:${bomDependencyVersions['rxjava3.version']}", + 'sitemesh' : "opensymphony:sitemesh:${bomDependencyVersions['sitemesh.version']}", + 'spock-core' : "org.spockframework:spock-core:${bomDependencyVersions['spock.version']}", + 'spock-spring' : "org.spockframework:spock-spring:${bomDependencyVersions['spock.version']}", + 'spring-retry' : "org.springframework.retry:spring-retry:${bomDependencyVersions['spring-retry.version']}", + 'starter-sitemesh' : "org.sitemesh:spring-boot-starter-sitemesh:${bomDependencyVersions['starter-sitemesh.version']}", ++ 'spring-webmvc-sitemesh' : "org.sitemesh:spring-webmvc-sitemesh:${bomDependencyVersions['spring-webmvc-sitemesh.version']}", ] // Because pom exclusions aren't properly supported by gradle, we can't inherit the grails-gradle-bom diff --cc gradle.properties index 3f7bf4ca9a,5a6abc98ec..547692b327 --- a/gradle.properties +++ b/gradle.properties @@@ -50,15 -50,13 +50,17 @@@ yakworksHibernateGroovyProxyVersion=1. # Build dependency versions not managed by BOMs apacheRatVersion=0.8.1 gradleChecksumPluginVersion=1.4.0 -# note: the cyclonedx 3 requires Gradle 9 -gradleCycloneDxPluginVersion=2.4.1 +gradleCycloneDxPluginVersion=3.0.0 # micronaut libraries not in the bom due to the potential for spring mismatches -# Note: we cannot update to 4.10.x due to netty 4.2 being used (incompatible with spring boot 3.5.x) -micronautPlatformVersion=4.9.4 +micronautPlatformVersion=5.0.0-M2 + micronautRxjava2Version=2.9.0 ++micronautSerdeJacksonVersion=2.11.0 + +# Pass -PskipMicronautProjects (presence-based, like skipFunctionalTests / skipCodeStyle) +# to drop the Grails-Micronaut "island" (grails-micronaut, grails-micronaut-bom, and +# the micronaut-tied test-examples) from the build graph. See settings.gradle for the +# gating logic and grails-core#15613 for the rationale. # Libraries only specific to test apps, these should not be exposed ersatzVersion=4.0.1 diff --cc grails-doc/src/en/guide/toc.yml index 75f0009fef,d7a6cd0bb1..5f8d5504a6 --- a/grails-doc/src/en/guide/toc.yml +++ b/grails-doc/src/en/guide/toc.yml @@@ -36,7 -36,7 +36,8 @@@ gettingStarted developmentReloading: Development Reloading upgrading: title: Upgrading from the previous versions + upgrading80x: Upgrading from Grails 7 to Grails 8 + upgrading72x: Upgrading from Grails 7.1 to Grails 7.2 upgrading71x: Upgrading from Grails 7.0 to Grails 7.1 upgrading70x: Upgrading from Grails 6 to Grails 7.0 upgrading60x: Upgrading from Grails 5 to Grails 6 diff --cc grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java index f75d3a22fb,422d796c68..79ec59002f --- a/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java +++ b/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java @@@ -39,10 -37,9 +37,9 @@@ import org.springframework.beans.factor import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.beans.factory.support.ManagedList; import org.springframework.boot.autoconfigure.AutoConfigureAfter; - import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.boot.webmvc.autoconfigure.WebMvcAutoConfiguration; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --cc settings.gradle index 2cc1ba3650,b5669c29e4..969f1c7f65 --- a/settings.gradle +++ b/settings.gradle @@@ -405,15 -419,21 +434,17 @@@ include 'grails-test-examples-geb-gebconfig', 'grails-test-examples-gorm', 'grails-test-examples-gsp-layout', - 'grails-test-examples-gsp-sitemesh3', - 'grails-test-examples-gsp-spring-boot', + // TODO: 'grails-test-examples-gsp-sitemesh3', + // TODO: 'grails-test-examples-gsp-spring-boot', 'grails-test-examples-hyphenated', 'grails-test-examples-issue-11102', - 'grails-test-examples-issue-11767', 'grails-test-examples-issue-15228', + 'grails-test-examples-issue-10279', 'grails-test-examples-issue-698-domain-save-npe', 'grails-test-examples-issue-views-182', + 'grails-test-examples-jetty', - 'grails-test-examples-micronaut', - 'grails-test-examples-micronaut-groovy-only', 'grails-test-examples-namespaces', 'grails-test-examples-plugins-exploded', - 'grails-test-examples-plugins-issue-11767', 'grails-test-examples-plugins-issue11005', 'grails-test-examples-plugins-loadafter', 'grails-test-examples-plugins-loadfirst', @@@ -452,8 -475,12 +483,9 @@@ project(':grails-test-examples-plugins- project(':grails-test-examples-plugins-loadsecond').projectDir = file('grails-test-examples/plugins/loadsecond') project(':grails-test-examples-plugins-loadafter').projectDir = file('grails-test-examples/plugins/loadafter') project(':grails-test-examples-plugins-issue11005').projectDir = file('grails-test-examples/plugins/issue11005') -project(':grails-test-examples-issue-11767').projectDir = file('grails-test-examples/issue-11767') project(':grails-test-examples-issue-15228').projectDir = file('grails-test-examples/issue-15228') + project(':grails-test-examples-issue-10279').projectDir = file('grails-test-examples/issue-10279') project(':grails-test-examples-plugins-exploded').projectDir = file('grails-test-examples/plugins/exploded') -project(':grails-test-examples-plugins-issue-11767').projectDir = file('grails-test-examples/plugins/issue-11767') -project(':grails-test-examples-plugins-micronaut-singleton').projectDir = file('grails-test-examples/plugins/micronaut-singleton') project(':grails-test-examples-cache').projectDir = file('grails-test-examples/cache') project(':grails-test-examples-config-report').projectDir = file('grails-test-examples/config-report') project(':grails-test-examples-scaffolding').projectDir = file('grails-test-examples/scaffolding')
