Skip to content

8.0.x Hibernate 7 Publishing Fixes & Bom Addition#15510

Draft
jdaugherty wants to merge 218 commits into8.0.x-hibernate7from
8.0.x-hibernate7-bom
Draft

8.0.x Hibernate 7 Publishing Fixes & Bom Addition#15510
jdaugherty wants to merge 218 commits into8.0.x-hibernate7from
8.0.x-hibernate7-bom

Conversation

@jdaugherty
Copy link
Contributor

@jdaugherty jdaugherty commented Mar 16, 2026

Current Progress:

  • Fixing bad merges of the gradle plugin extraction
  • Fixing license headers
  • Fixing styling
  • Attempted merge of code styles
  • Running CI against hibernate 7 branch
  • Splitting boms into a hibernate5 & 7 bom (probably needs more work)

TODO:

  • docs need further updates
  • several functional tests were added for hibernate 5 and not copied to the hibernate 7 - @jamesfredley
  • we need to diff the hibernate 5 functional tests with hibernate 7 to see if any were subsequently changed - @jamesfredley
  • functional tests in hibernate 7 should use the hibernate 7 bom.
  • grails-datamapping-core changes need to be looked at closer; I might have merged these the wrong way. - @jamesfredley

jdaugherty and others added 30 commits November 23, 2025 09:49
GrailsOpenSessionInViewInterceptor only registered a session for the
default datasource SessionFactory. Calling withSession on a secondary
datasource during a web request threw 'No Session found for current
thread' because no session was bound for that SessionFactory.

The interceptor now iterates all connection sources from the
HibernateDatastore and opens/binds sessions for each non-default
datasource in preHandle, flushes them in postHandle, and unbinds/closes
them in afterCompletion. Existing sessions that are already bound (e.g.
by a transaction) are left untouched.

Fixes #14333
Fixes #11798

Assisted-by: Claude Code <Claude@Claude.ai>
Wrap the additional session cleanup loop in try-finally so that
super.afterCompletion() always runs even if closing an additional
session throws. Add per-session try-catch around closeSession with
error logging, matching HibernatePersistenceContextInterceptor.destroy()
pattern.

Assisted-by: Claude Code <Claude@Claude.ai>
Include the datasource connection name in debug and error log messages
for GrailsOpenSessionInViewInterceptor to aid multi-datasource debugging.

Add a Geb integration test in the datasources test module that verifies
OSIV keeps the secondary datasource session open during GSP view
rendering, allowing lazy-loaded associations to be accessed without
LazyInitializationException.

Assisted-by: Claude Code <Claude@Claude.ai>
Use Book.secondary.findByTitle instead of Book.secondary.first to
avoid picking up stale records from other integration tests sharing
the same H2 database.

Assisted-by: Claude Code <Claude@Claude.ai>
Add two new TCK specs that validate GORM Data Service CRUD operations
route correctly to secondary datasources across all datastore
implementations:

- DataServiceConnectionRoutingSpec: 16 tests covering save, get, count,
  delete, findByName, findAllByName, and constructor-style save through
  both abstract class and interface service patterns, plus cross-datasource
  isolation verification.

- DataServiceMultiTenantConnectionRoutingSpec: 5 tests covering
  DISCRIMINATOR multi-tenancy combined with secondary datasource routing,
  verifying tenant isolation for save, get, count, delete, and findByName.

Adds multi-tenant + multi-datasource infrastructure to TCK:
- GrailsDataTckManager: new supportsMultiTenantMultiDataSource(),
  setupMultiTenantMultiDataSource(), cleanupMultiTenantMultiDataSource(),
  getServiceForMultiTenantConnection() methods
- GrailsDataHibernate5TckManager: DISCRIMINATOR mode with
  SystemPropertyTenantResolver and dual H2 in-memory databases
- GrailsDataMongoTckManager: DISCRIMINATOR mode with
  SystemPropertyTenantResolver and dual MongoDB databases

Fixes AbstractDatastoreInitializer.loadDataServices() to filter discovered
services by mapped domain classes, preventing classpath pollution from
unrelated @service implementations causing startup failures in standalone
initializers (e.g., MongoDbDataStoreSpringInitializerSpec).

Assisted-by: Claude Code <Claude@Claude.ai>
Add four new TCK specs that test GORM operations at the domain level
via GormEnhancer API, and verify cross-layer consistency between
domain operations and Data Service operations:

- DomainMultiDataSourceSpec: 8 tests for direct save, get, count,
  list, criteria query, delete on secondary datasource, plus
  cross-datasource isolation.

- DomainMultiTenantMultiDataSourceSpec: 5 tests for DISCRIMINATOR
  multi-tenancy with direct domain operations on secondary datasource,
  including tenant-scoped count, criteria query, and isolation.

- CrossLayerMultiDataSourceSpec: 5 tests verifying data written at
  the domain level is visible through Data Services and vice versa,
  including delete propagation and count consistency.

- CrossLayerMultiTenantMultiDataSourceSpec: 3 tests verifying
  tenant-isolated data is consistent across domain API and Data
  Service layers.

Assisted-by: Claude Code <Claude@Claude.ai>
…ices

@service(DomainClass) now automatically inherits the datasource from
the domain class's mapping block, so developers no longer need to
specify @transactional(connection = '...') when the domain already
declares its datasource. Explicit @transactional(connection) on the
service still takes precedence.

Two-layer implementation:
- AST (ServiceTransformation): parses the domain's static mapping
  closure for datasource/connection calls and propagates to the
  generated service impl via @transactional(connection)
- Runtime (DatastoreServiceMethodInvokingFactoryBean): resolves the
  domain's datasource from the mapping context and sets the correct
  datastore on the service instance

Assisted-by: Claude Code <Claude@Claude.ai>
- Fix runtime precedence: resolveEffectiveDatastore() now checks service
  @transactional(connection) before falling back to domain mapping
- Fix functional test to use @Autowired instead of manual service retrieval
- Add integration test for service obtained from default datastore
- Improve explicit-wins test to verify annotation preservation with
  different connection values (archive vs warehouse)
- Fix docs: findByCode -> findAllByCode for List return type

Assisted-by: Claude Code <Claude@Claude.ai>
…guide

Assisted-by: Claude Code <Claude@Claude.ai>
… and functional test suites

Verify that GORM static methods (executeQuery, withCriteria, createCriteria,
executeUpdate, withTransaction) route to the correct datasource for entities
mapped to non-default datasources. Covers the allQualifiers() fix in 4e04e96.

Assisted-by: Claude Code <Claude@Claude.ai>
…iTenant routing, and CRUD connection fixes

Add documentation reflecting the post-fix state after PRs #15393,
#15395, and #15396 are merged:

- Add @CompileStatic + injected @service property example (PR #15396)
- Add Multi-Tenancy with explicit datasource section (PR #15393)
- List all CRUD methods that respect connection routing (PR #15395)
- Soften IMPORTANT boxes to NOTE with authoritative tone

Assisted-by: Claude Code <Claude@Claude.ai>
…list

Add @Where-annotated methods, @Query-annotated methods, and
DetachedCriteria-based queries to the list of auto-implemented methods
that respect the connection parameter in multi-datasource Data Services
documentation.

Assisted-by: Claude Code <Claude@Claude.ai>
Domain static methods like Book.executeQuery(), Book.createCriteria(),
and Book.withCriteria() route to the correct datasource automatically
when the domain declares a non-default datasource in its mapping block.
Remove all references to GormEnhancer.findStaticApi() from user-facing
documentation since it is an internal API that users no longer need.

Assisted-by: Claude Code <Claude@Claude.ai>
…cription

Remove GormEnhancer class name from multi-tenancy explanation since it
is an internal implementation detail. Fix description of how @service
properties are populated to say autowiring by type instead of
datastore.getService().

Assisted-by: Claude Code <Claude@Claude.ai>
# Conflicts:
#	grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
#	grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy
#	grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootVirtualThreadsSpec.groovy
@testlens-app

This comment has been minimized.

@testlens-app

This comment has been minimized.

@testlens-app

This comment has been minimized.

@testlens-app

This comment has been minimized.

@jdaugherty jdaugherty added feature and removed bug labels Mar 17, 2026
@jdaugherty jdaugherty added this to the grails:8.0.0-M1 milestone Mar 17, 2026
Move the DetachedCriteria.count() projection workaround into the Query
abstraction layer. The base Query.countResults() falls back to list().size()
when user-defined projections exist. H5 overrides in AbstractHibernateQuery
to check its own HibernateProjectionList. H7 inherits the base default for
now, with an optimization path available via Hibernate 7's derived-table
JPA Criteria API. DetachedCriteria.count() now delegates to a single
query.countResults() call with no backend-specific branching.

Assisted-by: Claude Code <Claude@Claude.ai>
Copy test specs added on the 7.0.x branch for bug fixes and features that
were never ported to the Hibernate 7 module. Includes query specs
(BasicCollectionInQuery, DetachedCriteriaProjectionNullAssociation,
WhereQueryBugFix, WhereQueryOldIssueVerification, SqlQuery, RLike,
HibernateValidation), multi-datasource specs (DataServiceDatasource
Inheritance, DataServiceMultiDataSource, DataServiceMultiTenantMulti
DataSource, WhereQueryMultiDataSource, MultiDataSourceSession),
ExistsCrossJoinSpec, and SimpleHibernateProxyHandlerSpec.

Assisted-by: Claude Code <Claude@Claude.ai>
Add 17 missing test methods to HibernateProxyHandler7Spec covering null
handling, persistent collections, associations, createProxy, unwrap, and
deprecated methods. Port 5 ByteBuddy proxy tests from H5 covering
CompileStatic id checks, dynamic getId, truthy checks, association id
checks, and isDirty. All 5 are marked @PendingFeature because Hibernate 7's
ByteBuddyInterceptor initializes proxies on getMetaClass() and there is no
H7-compatible replacement for yakworks hibernate-groovy-proxy.

Assisted-by: Claude Code <Claude@Claude.ai>
Add grails-data-service-multi-datasource and grails-multitenant-multi-
datasource test apps for H7, ported from H5 with dependency updates.
Copy SecondaryBookController, UrlMappings, and MultiDataSourceWithSession
Spec to the existing grails-multiple-datasources H7 app. Add BookPages
Geb page objects and update BookControllerSpec to use them instead of
inline selectors. Register new test apps in settings.gradle.

Assisted-by: Claude Code <Claude@Claude.ai>
Add supportsMultipleDataSources(), setupMultiDataSource(), and multi-tenant
multi-datasource methods to GrailsDataHibernate7TckManager, matching the H5
implementation. This enables 34 TCK tests that were previously skipped due
to the missing multi-datasource test harness.

Port 2 missing test methods to MultipleDataSourceConnectionsSpec: 'static
GORM operations' (@PendingFeature due to executeQuery named parameter
binding on non-default datasource) and 'ALL mapped entity withNewSession'
(passes). Port JPA @onetomany test to TwoUnidirectionalHasManySpec
(@PendingFeature due to non-nullable join column generation in H7).

Assisted-by: Claude Code <Claude@Claude.ai>
Remove WhereQueryConnectionRoutingSpec from the skipped tests table since
multi-datasource TCK support is now implemented. The spec was previously
skipped because the test manager did not wire setupMultiDataSource().

Assisted-by: Claude Code <Claude@Claude.ai>
@testlens-app

This comment has been minimized.

@github-actions github-actions bot added the bug label Mar 19, 2026
@jamesfredley
Copy link
Contributor

I pushed commits addressing

  1. several functional tests were added for hibernate 5 and not copied to the hibernate 7 -
  2. we need to diff the hibernate 5 functional tests with hibernate 7 to see if any were subsequently changed -
  3. grails-datamapping-core changes need to be looked at closer; I might have merged these the wrong way. - Implements an H5 and H7 solution for DetachedCriteria.count(), the merge looked right

Known issues after these commits:

H7 Test Gaps - Detailed Analysis

1. ByteBuddy Proxy Initialization (5 tests)

Root cause: Hibernate 7's ByteBuddyInterceptor.intercept() doesn't distinguish Groovy's getMetaClass() call from a real property access. Any method call on a proxy - including getId(), truthiness checks (if (proxy)), and isDirty() - triggers proxy initialization via the interceptor.

Stack trace path:
team.getId() -> ByteBuddyInterceptor.intercept() -> BasicLazyInitializer.invoke() -> initializes proxy -> Hibernate.isInitialized(team) returns true

Why H5 worked (partially): In H5, @CompileStatic getId() and isDirty() didn't trigger initialization because H5's ByteBuddyInterceptor had slightly different interception logic. The 3 dynamic Groovy tests (truthy, id, association id) failed in H5 too unless yakworks was present.

Why yakworks 1.1 can't fix H7: The yakworks ByteBuddyGroovyInterceptor extends ByteBuddyInterceptor but its constructor takes java.io.Serializable id while H7's takes java.lang.Object id - binary incompatible. The library hasn't been updated since September 2022.

Fix path: Write a Hibernate 7-compatible Groovy interceptor that overrides intercept() to return null for getMetaClass() and intercept toString() to avoid hydration. Roughly 50 lines of Java. Could live in grails-data-hibernate7 directly rather than as an external library.

Affected tests:

  • getId and id property checks dont initialize proxy if in a CompileStatic method
  • getId and id dont initialize proxy
  • truthy check on instance should not initialize proxy
  • id checks on association should not initialize its proxy
  • isDirty should not intialize the association proxy

2. JPA @onetomany Unidirectional Join Table (1 test)

Root cause: Hibernate 7 generates a single join table EcmMaskJpa_JpaUser for both @OneToMany associations (createdUsers and updatedUsers). The DDL creates columns (EcmMaskJpa_id, createdUsers_id, updatedUsers_id) where ALL columns are non-nullable. When inserting a createdUsers row, updatedUsers_id is NULL, violating the constraint.
SQL generated:

insert into EcmMaskJpa_JpaUser (EcmMaskJpa_id, createdUsers_id) values (?, ?)
-- Fails: NULL not allowed for column "UPDATEDUSERS_ID"

Why: Hibernate 7 merges the two @OneToMany sets into one join table by default when both target the same entity type. H5 created separate join tables. This is a Hibernate 7 behavior change for entities with multiple @OneToMany(cascade=ALL) to the same target type.
Fix path: Add @JoinTable annotations to specify separate tables:

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "ecm_mask_created_users")
Set<JpaUser> createdUsers = []
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "ecm_mask_updated_users")
Set<JpaUser> updatedUsers = []

Affected test:

  • test two JPA unidirectional one to many references

3. executeQuery Named Parameters on Multi-Datasource Entity (1 test)

Root cause: Book.executeQuery("from Book where name = :name", [name: uniqueName]) throws QueryParameterException: No argument for named parameter ':name'. The parameter map IS passed, but the H7 HQL query execution path doesn't bind it correctly when the entity is routed to a non-default datasource.
Stack trace path:

GormEntity.executeQuery()
  -> HibernateGormStaticApi.executeQuery()
  -> doListInternal()
  -> HibernateHqlQuery.executeQuery()
  -> SelectQueryDelegate.list()
  -> AbstractSelectionQuery.list()
  -> QueryParameterBindingsImpl.validate()
  -> throws QueryParameterException

Why: The HibernateHqlQuery in H7 creates the Hibernate Query object and passes parameters, but when routing through a non-default datasource connection, the parameter binding happens on a different session than expected. The SelectQueryDelegate creates the native Hibernate query but the parameters from the GORM map aren't being forwarded to it properly.
Fix path: Debug HibernateHqlQuery.executeQuery() and SelectQueryDelegate.list() to verify parameter binding when the session comes from a non-default datasource. Likely a session/query mismatch in the multi-datasource routing code.
Affected test:

  • static GORM operations use first non-default datasource for multi datasource entity

…nant spec

The H7 test pattern uses explicit cleanup() to reset system properties
instead of Spock's @RestoreSystemProperties annotation.

Assisted-by: Claude Code <Claude@Claude.ai>
@testlens-app

This comment has been minimized.

Override countResults() in H7 HibernateQuery to use
JpaSelectCriteria.from(Subquery) for proper derived-table counting instead
of the list().size() fallback. Add populateSubquery() to
JpaCriteriaQueryCreator that builds the inner query with aliased projections
as required by Hibernate 7's SqmDerivedRoot. Restore the performance warning
log in H5 AbstractHibernateQuery.countResults(). Add DetachedCriteriaCountSpec
with 6 test methods covering count with/without projections, groupProperty,
aggregate, and filtered criteria - passes on both H5 and H7.

Assisted-by: Claude Code <Claude@Claude.ai>
@testlens-app

This comment has been minimized.

Replace count(col_0) with count(literal(1)) to avoid undercounting when the
first projected column is nullable. Widen JpaFromProvider constructor from
JpaCriteriaQuery to AbstractQuery so populateSubquery() can pass the
subquery directly instead of null, preventing NPE when association criteria
generate additional roots.

Assisted-by: Claude Code <Claude@Claude.ai>
@testlens-app
Copy link

testlens-app bot commented Mar 19, 2026

🚨 TestLens detected 33 failed tests 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

Check Project/Task Test Runs
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property does have `.id` at the end of the name > input for a many-to-one property does have `.id` at the end of the name
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property does have `.id` at the end of the name > input for a one-to-one property does have `.id` at the end of the name
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property doesnt have .id at the end of the name > input for a many-to-many property doesnt have .id at the end of the name
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property is a select > input for a many-to-many property is a select
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property is a select > input for a many-to-one property is a select
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > input for a #description property is a select > input for a one-to-one property is a select
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > select for a #description property with a value of #value has the correct option selected > select for a many-to-many property with a value of [Homer Simpson] has the correct option selected
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > select for a #description property with a value of #value has the correct option selected > select for a many-to-one property with a value of Homer Simpson has the correct option selected
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > select for a #description property with a value of #value has the correct option selected > select for a one-to-one property with a value of Homer Simpson has the correct option selected
CI / Build Grails-Core (ubuntu-latest, 25) :grails-fields:test DefaultInputRenderingSpec > select for a many-to-many property has the multiple attribute
CI / Functional Tests (Java 17, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test that the delete action deletes an instance if it exists
CI / Functional Tests (Java 17, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the index action returns the correct model
CI / Functional Tests (Java 17, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the save action correctly persists an instance
CI / Functional Tests (Java 17, indy=true) :grails-test-examples-app1:test BookControllerSpec > Test that the delete action deletes an instance if it exists
CI / Functional Tests (Java 17, indy=true) :grails-test-examples-app1:test BookControllerSpec > Test the index action returns the correct model
CI / Functional Tests (Java 17, indy=true) :grails-test-examples-app1:test BookControllerSpec > Test the save action correctly persists an instance
CI / Functional Tests (Java 21, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test that the delete action deletes an instance if it exists
CI / Functional Tests (Java 21, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the index action returns the correct model
CI / Functional Tests (Java 21, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the save action correctly persists an instance
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test that the delete action deletes an instance if it exists
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the index action returns the correct model
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-app1:test BookControllerSpec > Test the save action correctly persists an instance
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test CarServiceSpec > test one
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test CarSpec > test basic persistence mocking
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test DataTestTraitSpec > test basic persistence mocking
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test GetDomainClassesToMockMethodSpec > test basic persistence mocking
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test PersonControllerSpec > test action which invokes GORM method
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test PersonSpec > test basic persistence mocking
CI / Functional Tests (Java 25, indy=false) :grails-test-examples-demo33:test UniqueConstraintOnHasOneSpec > Foo's name should be unique

🏷️ Commit: d191944
▶️ Tests: 8941 executed
🟡 Checks: 7/28 completed

Test Failures (first 5 of 33)

DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option (:grails-fields:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition failed with Exception:

tagLib.renderDefaultInput(model).contains('<option value="null"></option>') ^ required
|      |                  |
|      |                  [type:class grails.plugin.formfields.mock.Person, property:prop, constraints:null, persistentProperty:Mock for type 'ManyToOne' named 'manyToOneProperty', required:true]
|      java.lang.NullPointerException: Cannot execute null+null
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
|      	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
|      	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
|      	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
|      	at groovy.lang.Closure.call(Closure.java:433)
|      	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
|      	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
|      	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
|      	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
|      	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
<grails.plugin.formfields.FormFieldsTagLib@6980b4c7 localizeNumbers=true exclusionsList=[id, dateCreated, lastUpdated] exclusionsInput=[version, dateCreated, lastUpdated] exclusionsDisplay=[version, dateCreated, lastUpdated] formFieldsTemplateService=null beanPropertyAccessorFactory=grails.plugin.formfields.BeanPropertyAccessorFactory@319ea996 fieldsDomainPropertyFactory=org.grails.scaffolding.model.property.DomainPropertyFactoryImpl@2af733b5 mappingContexts=[org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext@3445ddf2] domainModelService=org.grails.scaffolding.model.DomainModelServiceImpl@1a3a6216 localeResolver=org.springframework.web.servlet.i18n.SessionLocaleResolver@5032b2e codecLookup=org.grails.plugins.codecs.DefaultCodecLookup@577dac16 messageSource=org.springframework.context.support.StaticMessageSource: {} with=grails.plugin.formfields.FormFieldsTagLib$_closure1@67ac1be1 all=grails.plugin.formfields.FormFieldsTagLib$_closure2@1d6d2b60 field=grails.plugin.formfields.FormFieldsTagLib$_closure3@a200a54 table=grails.plugin.formfields.FormFieldsTagLib$_closure4@347e6bc6 input=grails.plugin.formfields.FormFieldsTagLib$_closure5@330a0dbb widget=grails.plugin.formfields.FormFieldsTagLib$_closure6@47c81691 displayWidget=grails.plugin.formfields.FormFieldsTagLib$_closure7@4db0d696 display=grails.plugin.formfields.FormFieldsTagLib$_closure8@a57b4bd grails_artefact_TagLibrary__rawEncoder=null grails_artefact_gsp_TagLibraryInvoker__developmentMode=false grails_artefact_gsp_TagLibraryInvoker__tagLibraryLookup=org.grails.testing.runtime.support.LazyTagLibraryLookup@3ba50851 grails_web_api_WebAttributes__grailsApplication=null grails_web_api_ServletAttributes__applicationContext=null grails_web_api_ServletAttributes__servletContext=null>

	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
Caused by: java.lang.NullPointerException: Cannot execute null+null
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
	... 1 more
DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option (:grails-fields:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition failed with Exception:

tagLib.renderDefaultInput(model).contains('<option value="null"></option>') ^ required
|      |                  |
|      |                  [type:class grails.plugin.formfields.mock.Person, property:prop, constraints:null, persistentProperty:Mock for type 'ManyToOne' named 'manyToOneProperty', required:false]
|      java.lang.NullPointerException: Cannot execute null+null
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
|      	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
|      	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
|      	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
|      	at groovy.lang.Closure.call(Closure.java:433)
|      	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
|      	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
|      	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
|      	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
|      	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
<grails.plugin.formfields.FormFieldsTagLib@28cfdcb localizeNumbers=true exclusionsList=[id, dateCreated, lastUpdated] exclusionsInput=[version, dateCreated, lastUpdated] exclusionsDisplay=[version, dateCreated, lastUpdated] formFieldsTemplateService=null beanPropertyAccessorFactory=grails.plugin.formfields.BeanPropertyAccessorFactory@319ea996 fieldsDomainPropertyFactory=org.grails.scaffolding.model.property.DomainPropertyFactoryImpl@2af733b5 mappingContexts=[org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext@3445ddf2] domainModelService=org.grails.scaffolding.model.DomainModelServiceImpl@1a3a6216 localeResolver=org.springframework.web.servlet.i18n.SessionLocaleResolver@5032b2e codecLookup=org.grails.plugins.codecs.DefaultCodecLookup@577dac16 messageSource=org.springframework.context.support.StaticMessageSource: {} with=grails.plugin.formfields.FormFieldsTagLib$_closure1@f610578 all=grails.plugin.formfields.FormFieldsTagLib$_closure2@4b0e6ed6 field=grails.plugin.formfields.FormFieldsTagLib$_closure3@54cf508a table=grails.plugin.formfields.FormFieldsTagLib$_closure4@80fc9d6 input=grails.plugin.formfields.FormFieldsTagLib$_closure5@f42576a widget=grails.plugin.formfields.FormFieldsTagLib$_closure6@3782e08a displayWidget=grails.plugin.formfields.FormFieldsTagLib$_closure7@19e7adf0 display=grails.plugin.formfields.FormFieldsTagLib$_closure8@6f509663 grails_artefact_TagLibrary__rawEncoder=null grails_artefact_gsp_TagLibraryInvoker__developmentMode=false grails_artefact_gsp_TagLibraryInvoker__tagLibraryLookup=org.grails.testing.runtime.support.LazyTagLibraryLookup@3ba50851 grails_web_api_WebAttributes__grailsApplication=null grails_web_api_ServletAttributes__applicationContext=null grails_web_api_ServletAttributes__servletContext=null>

	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
Caused by: java.lang.NullPointerException: Cannot execute null+null
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
	... 1 more
DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option (:grails-fields:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition failed with Exception:

tagLib.renderDefaultInput(model).contains('<option value="null"></option>') ^ required
|      |                  |
|      |                  [type:class grails.plugin.formfields.mock.Person, property:prop, constraints:null, persistentProperty:Mock for type 'OneToOne' named 'oneToOneProperty', required:true]
|      java.lang.NullPointerException: Cannot execute null+null
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
|      	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
|      	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
|      	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
|      	at groovy.lang.Closure.call(Closure.java:433)
|      	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
|      	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
|      	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
|      	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
|      	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
<grails.plugin.formfields.FormFieldsTagLib@3514624f localizeNumbers=true exclusionsList=[id, dateCreated, lastUpdated] exclusionsInput=[version, dateCreated, lastUpdated] exclusionsDisplay=[version, dateCreated, lastUpdated] formFieldsTemplateService=null beanPropertyAccessorFactory=grails.plugin.formfields.BeanPropertyAccessorFactory@319ea996 fieldsDomainPropertyFactory=org.grails.scaffolding.model.property.DomainPropertyFactoryImpl@2af733b5 mappingContexts=[org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext@3445ddf2] domainModelService=org.grails.scaffolding.model.DomainModelServiceImpl@1a3a6216 localeResolver=org.springframework.web.servlet.i18n.SessionLocaleResolver@5032b2e codecLookup=org.grails.plugins.codecs.DefaultCodecLookup@577dac16 messageSource=org.springframework.context.support.StaticMessageSource: {} with=grails.plugin.formfields.FormFieldsTagLib$_closure1@443641bf all=grails.plugin.formfields.FormFieldsTagLib$_closure2@3577d2a2 field=grails.plugin.formfields.FormFieldsTagLib$_closure3@177c8d08 table=grails.plugin.formfields.FormFieldsTagLib$_closure4@4856ec9 input=grails.plugin.formfields.FormFieldsTagLib$_closure5@7248ec5f widget=grails.plugin.formfields.FormFieldsTagLib$_closure6@79a1d276 displayWidget=grails.plugin.formfields.FormFieldsTagLib$_closure7@ac61487 display=grails.plugin.formfields.FormFieldsTagLib$_closure8@251ad030 grails_artefact_TagLibrary__rawEncoder=null grails_artefact_gsp_TagLibraryInvoker__developmentMode=false grails_artefact_gsp_TagLibraryInvoker__tagLibraryLookup=org.grails.testing.runtime.support.LazyTagLibraryLookup@3ba50851 grails_web_api_WebAttributes__grailsApplication=null grails_web_api_ServletAttributes__applicationContext=null grails_web_api_ServletAttributes__servletContext=null>

	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
Caused by: java.lang.NullPointerException: Cannot execute null+null
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
	... 1 more
DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option (:grails-fields:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition failed with Exception:

tagLib.renderDefaultInput(model).contains('<option value="null"></option>') ^ required
|      |                  |
|      |                  [type:class grails.plugin.formfields.mock.Person, property:prop, constraints:null, persistentProperty:Mock for type 'OneToOne' named 'oneToOneProperty', required:false]
|      java.lang.NullPointerException: Cannot execute null+null
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
|      	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
|      	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
|      	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
|      	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
|      	at groovy.lang.Closure.call(Closure.java:433)
|      	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
|      	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
|      	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
|      	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
|      	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
|      	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
<grails.plugin.formfields.FormFieldsTagLib@11ff1c7f localizeNumbers=true exclusionsList=[id, dateCreated, lastUpdated] exclusionsInput=[version, dateCreated, lastUpdated] exclusionsDisplay=[version, dateCreated, lastUpdated] formFieldsTemplateService=null beanPropertyAccessorFactory=grails.plugin.formfields.BeanPropertyAccessorFactory@319ea996 fieldsDomainPropertyFactory=org.grails.scaffolding.model.property.DomainPropertyFactoryImpl@2af733b5 mappingContexts=[org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext@3445ddf2] domainModelService=org.grails.scaffolding.model.DomainModelServiceImpl@1a3a6216 localeResolver=org.springframework.web.servlet.i18n.SessionLocaleResolver@5032b2e codecLookup=org.grails.plugins.codecs.DefaultCodecLookup@577dac16 messageSource=org.springframework.context.support.StaticMessageSource: {} with=grails.plugin.formfields.FormFieldsTagLib$_closure1@2fc2ea96 all=grails.plugin.formfields.FormFieldsTagLib$_closure2@28b15698 field=grails.plugin.formfields.FormFieldsTagLib$_closure3@578cda32 table=grails.plugin.formfields.FormFieldsTagLib$_closure4@2913f3ca input=grails.plugin.formfields.FormFieldsTagLib$_closure5@113d2a24 widget=grails.plugin.formfields.FormFieldsTagLib$_closure6@331abb0d displayWidget=grails.plugin.formfields.FormFieldsTagLib$_closure7@2f6aa16 display=grails.plugin.formfields.FormFieldsTagLib$_closure8@344d9421 grails_artefact_TagLibrary__rawEncoder=null grails_artefact_gsp_TagLibraryInvoker__developmentMode=false grails_artefact_gsp_TagLibraryInvoker__tagLibraryLookup=org.grails.testing.runtime.support.LazyTagLibraryLookup@3ba50851 grails_web_api_WebAttributes__grailsApplication=null grails_web_api_ServletAttributes__applicationContext=null grails_web_api_ServletAttributes__servletContext=null>

	at grails.plugin.formfields.DefaultInputRenderingSpec.input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option(DefaultInputRenderingSpec.groovy:587)
Caused by: java.lang.NullPointerException: Cannot execute null+null
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
	... 1 more
DefaultInputRenderingSpec > input for a #description property does have `.id` at the end of the name > input for a many-to-one property does have `.id` at the end of the name (:grails-fields:test in CI / Build Grails-Core (ubuntu-latest, 25))
java.lang.NullPointerException: Cannot execute null+null
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.applyMaxAndOffset(SimpleMapQuery.groovy:177)
	at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:163)
	at org.grails.datastore.mapping.query.Query.doList(Query.java:616)
	at org.grails.datastore.mapping.query.Query.list(Query.java:579)
	at org.grails.datastore.gorm.GormStaticApi.list_closure20(GormStaticApi.groovy:611)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:335)
	at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:44)
	at org.grails.datastore.gorm.GormStaticApi.list(GormStaticApi.groovy:610)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.list(GormEntity.groovy:769)
	at grails.plugin.formfields.FormFieldsTagLib.renderAssociationInput(FormFieldsTagLib.groovy:910)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:766)
	at grails.plugin.formfields.FormFieldsTagLib.renderDefaultInput(FormFieldsTagLib.groovy:719)
	at grails.plugin.formfields.DefaultInputRenderingSpec.input for a #description property does have `.id` at the end of the name(DefaultInputRenderingSpec.groovy:528)

Muted Tests

Note

Checks are currently running using the configuration below.

Select tests to mute in this pull request:

🔲 BookControllerSpec > Test that the delete action deletes an instance if it exists
🔲 BookControllerSpec > Test the index action returns the correct model
🔲 BookControllerSpec > Test the save action correctly persists an instance
🔲 CarServiceSpec > test one
🔲 CarSpec > test basic persistence mocking
🔲 DataTestTraitSpec > test basic persistence mocking
🔲 DefaultInputRenderingSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option
🔲 DefaultInputRenderingSpec > input for a #description property does have `.id` at the end of the name
🔲 DefaultInputRenderingSpec > input for a #description property doesnt have .id at the end of the name
🔲 DefaultInputRenderingSpec > input for a #description property is a select
🔲 DefaultInputRenderingSpec > select for a #description property with a value of #value has the correct option selected
🔲 DefaultInputRenderingSpec > select for a many-to-many property has the multiple attribute
🔲 GetDomainClassesToMockMethodSpec > test basic persistence mocking
🔲 PersonControllerSpec > test action which invokes GORM method
🔲 PersonSpec > test basic persistence mocking
🔲 UniqueConstraintOnHasOneSpec > Foo's name should be unique

Reuse successful test results:

🔲 ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

🔲 Rerun jobs


Learn more about TestLens at testlens.app.

Resolve all checkstyle violations in grails-data-hibernate7-core (287
errors across 77 files), grails-data-hibernate5-core (3 errors), and
grails-datastore-core (4 errors). Fixes include: expanding star imports,
correcting import ordering, moving operators to previous line, fixing
indentation, adding empty line separators, adding newlines at end of
files, fixing whitespace around braces, and removing unnecessary
semicolons.

Assisted-by: Claude Code <Claude@Claude.ai>
Remove unused GormQueryOperations import from GormStaticApi. Add missing
trailing newlines to NamedCriteriaProxy and FindByMethodSpec.

Assisted-by: Claude Code <Claude@Claude.ai>
…st app

MultiDataSourceWithSessionSpec requires micronaut-http-client and
micronaut-serde-jackson for integration tests, matching the H5 test app.

Assisted-by: Claude Code <Claude@Claude.ai>
The Core Projects code style check pipes Gradle output through tee into
build/codestyle-output.log, but the build/ directory may not exist at the
start of CI. Add mkdir -p to create the directory and reports subdirectory
before tee starts writing. Introduced in 7f13d5e.

Assisted-by: Claude Code <Claude@Claude.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

9 participants