This is an automated email from the ASF dual-hosted git repository.

jamesfredley pushed a commit to branch fix/dataservice-null-datastore-guard
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit b2aee988861a22f991235411b4b9afd998f62eaf
Author: James Fredley <[email protected]>
AuthorDate: Sat Feb 28 18:36:26 2026 -0500

    fix: add null safety for getDatastoreForConnection in data service factory 
bean
    
    Guard against datastore implementations that may return null from
    getDatastoreForConnection() by throwing a clear ConfigurationException
    with the connection name and service class, rather than silently
    setting a null datastore.
    
    Assisted-by: Claude Code <[email protected]>
---
 ...atastoreServiceMethodInvokingFactoryBean.groovy | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy
 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy
index ca2bfa88b6..973afd25c7 100644
--- 
a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy
+++ 
b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy
@@ -31,6 +31,7 @@ import org.grails.datastore.mapping.core.Datastore
 import org.grails.datastore.mapping.core.connections.ConnectionSource
 import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport
 import 
org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore
+import org.grails.datastore.mapping.core.exceptions.ConfigurationException
 import org.grails.datastore.mapping.services.Service
 
 /**
@@ -83,8 +84,16 @@ class DatastoreServiceMethodInvokingFactoryBean extends 
MethodInvokingFactoryBea
         if (serviceConnection != null
                 && ConnectionSource.DEFAULT != serviceConnection
                 && ConnectionSource.ALL != serviceConnection) {
-            return ((MultipleConnectionSourceCapableDatastore) 
defaultDatastore)
+            Datastore resolved = ((MultipleConnectionSourceCapableDatastore) 
defaultDatastore)
                     .getDatastoreForConnection(serviceConnection)
+            if (resolved == null) {
+                throw new ConfigurationException(
+                        "DataSource not found for connection name 
[${serviceConnection}] " +
+                        "specified via @Transactional on service 
[${serviceClass.name}]. " +
+                        'Please check your multiple data sources configuration 
and try again.'
+                )
+            }
+            return resolved
         }
 
         // Fall back to domain class mapping datasource
@@ -102,8 +111,17 @@ class DatastoreServiceMethodInvokingFactoryBean extends 
MethodInvokingFactoryBea
         if (domainConnection != null
                 && ConnectionSource.DEFAULT != domainConnection
                 && ConnectionSource.ALL != domainConnection) {
-            return ((MultipleConnectionSourceCapableDatastore) 
defaultDatastore)
+            Datastore resolved = ((MultipleConnectionSourceCapableDatastore) 
defaultDatastore)
                     .getDatastoreForConnection(domainConnection)
+            if (resolved == null) {
+                throw new ConfigurationException(
+                        "DataSource not found for connection name 
[${domainConnection}] " +
+                        "mapped on domain class [${domainClass.name}] " +
+                        "used by service [${serviceClass.name}]. " +
+                        'Please check your multiple data sources configuration 
and try again.'
+                )
+            }
+            return resolved
         }
 
         return defaultDatastore

Reply via email to