andys1802 opened a new issue, #14367:
URL: https://github.com/apache/grails-core/issues/14367
Hi,
I'm using Grails 6.2.0 tyring to use the ConnectionSources API to add and
remove Datasources at runtime, but got a NullPointerException (NPE). If the
SAME code is exected during BootStrap it works, but on calling later at runtime
via Service it fails
hibernateDatastore.getConnectionSources().addConnectionSource(
archivename,
dbconfig)
### Steps to Reproduce
1. Call during BootStrap is OK
_hibernateDatastore.getConnectionSources().addConnectionSource(
archivename,
dbconfig)
2. Call same code via Service fails
### Expected Behaviour
Should add the datasource and the corresponding tenant
### Actual Behaviour
Fails with stacktrace
Caused by: java.lang.NullPointerException: Cannot invoke
"org.grails.orm.hibernate.cfg.Mapping.getBatchSize()" because "m" is null
at
org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindSubClass(GrailsDomainBinder.java:1508)
at
org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindSubClasses(GrailsDomainBinder.java:1467)
at
org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRoot(GrailsDomainBinder.java:1410)
at
org.grails.orm.hibernate.cfg.GrailsDomainBinder.contribute(GrailsDomainBinder.java:161)
at
org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:292)
at
org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
at
org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:479)
at
org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
at
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:709)
at
org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.buildSessionFactory(HibernateMappingContextConfiguration.java:287)
at
org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:86)
at
org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39)
at
org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23)
at
org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.createRuntime(AbstractConnectionSourceFactory.java:70)
at
org.grails.datastore.mapping.core.connections.InMemoryConnectionSources.addConnectionSource(InMemoryConnectionSources.groovy:51)
at
org.grails.datastore.mapping.core.connections.AbstractConnectionSources.addConnectionSource(AbstractConnectionSources.groovy:96)
### Environment Information
- **Operating System**: Windows
- **GORM Version:** Default for Grails 6.2.0
- **Grails Version (if using Grails):** 6.2.0
- **JDK Version:** JDK17
### StackTrace during BootStrap > OK
at
com.devc.storage.DataSourceManager.addArchiveDataSource(DataSourceManager.groovy:70)
at
com.devc.storage.ArchiveService.$tt__init(ArchiveService.groovy:91)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1254)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030)
at
org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1036)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:1019)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:97)
at
com.devc.storage.ArchiveService$_init_closure4.doCall(ArchiveService.groovy)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030)
at groovy.lang.Closure.call(Closure.java:427)
at groovy.lang.Closure.call(Closure.java:416)
at
grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at
grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
at com.devc.storage.ArchiveService.init(ArchiveService.groovy)
at com.devc.storage.ArchiveService$init.call(Unknown Source)
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
at com.devc.BootStrap.initDataSources(BootStrap.groovy:94)
at com.devc.BootStrap$initDataSources$5.callCurrent(Unknown Source)
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
## StackTrace using a service --> FAILS
at
com.devc.storage.DataSourceManager.addArchiveDataSource(DataSourceManager.groovy:70)
at
com.devc.storage.ArchiveService.$tt__takeOnline(ArchiveService.groovy:51)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1254)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030)
at
org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1036)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:1019)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:97)
at
com.devc.storage.ArchiveService$_takeOnline_closure2.doCall(ArchiveService.groovy)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030)
at groovy.lang.Closure.call(Closure.java:427)
at groovy.lang.Closure.call(Closure.java:416)
at
grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at
grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
at com.devc.storage.ArchiveService.takeOnline(ArchiveService.groovy)
at com.devc.storage.ArchiveService$takeOnline$3.call(Unknown Source)
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
at
com.devc.storage.ArchiveController.takeOnline(ArchiveController.groovy:42)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
at
org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at
org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
at
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794)
at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
##############
Example code to reproduce: -> HibernateDataStore is set during bootstrap
package com.devc.storage
import com.devc.ConstraintService
import grails.compiler.GrailsCompileStatic
import groovy.util.logging.Slf4j
import org.grails.datastore.mapping.core.connections.ConnectionSource
import org.grails.datastore.mapping.core.connections.ConnectionSources
import org.grails.orm.hibernate.HibernateDatastore
import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings
import org.hibernate.SessionFactory
import org.springframework.transaction.annotation.Transactional
@GrailsCompileStatic
@Slf4j
@Singleton
class DataSourceManager {
private static String _CONFIGDBNAME = "config"
HibernateDatastore _hibernateDatastore
void init(HibernateDatastore hb) {
_hibernateDatastore = hb
addConfigDataSource()
}
private static Map<String, Object> getDatabaseConfig(String dbname,
boolean isencrypted) {
Map<String, Object> dbconfig = [
"hibernate.hbm2ddl.auto": "update",
"dialect" : "org.hibernate.dialect.H2Dialect",
"driverClassName" : "org.h2.Driver",
"pooled" : "true",
"username" :
ConstraintService.getProperty('info_app_dbuser'),
"password" :
ConstraintService.getProperty('info_app_dbpass') + (isencrypted ? " " +
ConstraintService.getProperty('info_app_dbpass') : ""),
"url" : "jdbc:h2:./" + dbname +
";LOCK_TIMEOUT=10000" + (isencrypted ? ";CIPHER=AES" : "")
] as Map<String, Object>
return dbconfig
}
HibernateDatastore getDataStore() {
return _hibernateDatastore
}
ConnectionSource addConfigDataSource() {
ConnectionSource s =
_hibernateDatastore.getConnectionSources().getConnectionSource(_CONFIGDBNAME)
if (!s) {
Map<String, Object> dbconfig =
getDatabaseConfig(ConstraintService._APPLICATION_NAME + "-" + _CONFIGDBNAME,
false)
s = _hibernateDatastore.getConnectionSources().addConnectionSource(
_CONFIGDBNAME,
dbconfig)
log.info "Datasource added for system database" + _CONFIGDBNAME
}
return s
}
Set<String> getConnectionSourceNames() {
Set result = new HashSet()
ConnectionSources<SessionFactory, HibernateConnectionSourceSettings>
connectionSources = _hibernateDatastore.getConnectionSources()
for (ConnectionSource<SessionFactory, HibernateConnectionSourceSettings>
connectionSource in connectionSources) {
result.add(connectionSource.name)
//println "Name $connectionSource.name -> $connectionSource.source ->
$connectionSource.settings"
}
return result
}
ConnectionSource addArchiveDataSource(String archivepath, String
archivename) {
ConnectionSource s =
_hibernateDatastore.getConnectionSources().getConnectionSource(archivename)
if (!s) {
Map<String, Object> dbconfig = getDatabaseConfig(archivepath + "/" +
archivename + "/archive", true)
s = _hibernateDatastore.getConnectionSources().addConnectionSource(
archivename,
dbconfig)
log.info "Datasource added for archive " + archivename
}
return s
}
void removeArchiveDataSource(String archivename) {
ConnectionSource s =
_hibernateDatastore.getConnectionSources().getConnectionSource(archivename)
if (s) {
if (s ==
_hibernateDatastore.getConnectionSources().getDefaultConnectionSource()) {
throw new Exception("NOT ALLOWED to close the default connection,
stupid!")
}
// Closing connection
s.close()
log.info "Datasource closed for archive " + archivename
}
}
}
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]