Grails 插件无法访问多数据源
Grails plugin cannot access to multidatasources
我有一个带有选项域实体的插件(我们称它的插件为 A
),还有一个带有强制性实体的插件(插件 B
)。插件 B
还定义了 2 个数据源(默认 dataSource
和 dataSource_redshift
)。在我的应用程序中,最初我依赖于插件 B
并且可以毫无问题地使用这两个数据源。但是,我现在已经将插件 A
添加为我的应用程序的依赖项,并且使用默认数据源的实体似乎运行良好,但如果我正在创建这样的实体:
class RedshiftEntity {
static mapping = {
datasource "redshift"
table name: "table", schema: "public"
id generator: 'assigned', column:'id'
version false
}
...
fields
...
}
加载应用程序时出现这样的错误:
Caused by: org.grails.datastore.mapping.core.exceptions.ConfigurationException: DataSource not found for name [dataSource_redshift] in configuration. Please check your multiple data sources configuration and try again.
at org.grails.orm.hibernate.HibernateDatastore.getDatastoreForConnection(HibernateDatastore.java:337)
at org.grails.orm.hibernate.HibernateGormEnhancer.getStaticApi(HibernateGormEnhancer.groovy:47)
at org.grails.datastore.gorm.GormEnhancer.registerEntity(GormEnhancer.groovy:139)
at org.grails.datastore.gorm.GormEnhancer.<init>(GormEnhancer.groovy:122)
at org.grails.orm.hibernate.HibernateGormEnhancer.<init>(HibernateGormEnhancer.groovy:41)
at org.grails.orm.hibernate.HibernateDatastore.initialize(HibernateDatastore.java:414)
at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:177)
at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:188)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1075)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 84 common frames omitted
万一我将这个实体移动到插件 B
- 它与 dataSource_redshift
一起工作得很好。请告诉我我错过了什么?
我找到了这个问题的根本原因。 Plugin B
具有特殊结构以启用或禁用名称为以下应用的第二个数据源:
switch(app_name) {
...
case 'main_app':
redshiftEnabled = true
...
}
我的主应用程序启用了 Redshift 数据源,但似乎数据源对插件并不像我预期的那样透明。当 plugin B
数据源作为依赖添加到主应用程序时,其他连接到应用程序的插件将不允许访问第二个数据源。我需要通过带有数据源的插件中的个人名称明确枚举插件:
switch(app_name) {
...
case 'main_app':
redshiftEnabled = true
case 'plugin_A':
redshiftEnabled = true
...
}
我更希望插件连接到主应用程序后,它们会使用主应用程序的名称访问数据源,但似乎并非如此。
我有一个带有选项域实体的插件(我们称它的插件为 A
),还有一个带有强制性实体的插件(插件 B
)。插件 B
还定义了 2 个数据源(默认 dataSource
和 dataSource_redshift
)。在我的应用程序中,最初我依赖于插件 B
并且可以毫无问题地使用这两个数据源。但是,我现在已经将插件 A
添加为我的应用程序的依赖项,并且使用默认数据源的实体似乎运行良好,但如果我正在创建这样的实体:
class RedshiftEntity {
static mapping = {
datasource "redshift"
table name: "table", schema: "public"
id generator: 'assigned', column:'id'
version false
}
...
fields
...
}
加载应用程序时出现这样的错误:
Caused by: org.grails.datastore.mapping.core.exceptions.ConfigurationException: DataSource not found for name [dataSource_redshift] in configuration. Please check your multiple data sources configuration and try again.
at org.grails.orm.hibernate.HibernateDatastore.getDatastoreForConnection(HibernateDatastore.java:337)
at org.grails.orm.hibernate.HibernateGormEnhancer.getStaticApi(HibernateGormEnhancer.groovy:47)
at org.grails.datastore.gorm.GormEnhancer.registerEntity(GormEnhancer.groovy:139)
at org.grails.datastore.gorm.GormEnhancer.<init>(GormEnhancer.groovy:122)
at org.grails.orm.hibernate.HibernateGormEnhancer.<init>(HibernateGormEnhancer.groovy:41)
at org.grails.orm.hibernate.HibernateDatastore.initialize(HibernateDatastore.java:414)
at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:177)
at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:188)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1075)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 84 common frames omitted
万一我将这个实体移动到插件 B
- 它与 dataSource_redshift
一起工作得很好。请告诉我我错过了什么?
我找到了这个问题的根本原因。 Plugin B
具有特殊结构以启用或禁用名称为以下应用的第二个数据源:
switch(app_name) {
...
case 'main_app':
redshiftEnabled = true
...
}
我的主应用程序启用了 Redshift 数据源,但似乎数据源对插件并不像我预期的那样透明。当 plugin B
数据源作为依赖添加到主应用程序时,其他连接到应用程序的插件将不允许访问第二个数据源。我需要通过带有数据源的插件中的个人名称明确枚举插件:
switch(app_name) {
...
case 'main_app':
redshiftEnabled = true
case 'plugin_A':
redshiftEnabled = true
...
}
我更希望插件连接到主应用程序后,它们会使用主应用程序的名称访问数据源,但似乎并非如此。