Grails插件无法访问multidatasources

时间:2017-10-29 09:06:24

标签: grails gorm datasource

我有一个插件(让我们称之为插件A)带有选项域实体和一个带有强制实体的插件(插件B)。插件B还有2个数据源的定义(默认dataSourcedataSource_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。请你知道我错过了什么?

1 个答案:

答案 0 :(得分:0)

我找到了这种问题的根本原因。 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 
    ...
}

我宁愿期待插件连接到主应用程序后,他们使用主应用程序的名称访问数据源,但似乎不是这样。