2017-10-29 7 views
0

私はプラグイン(プラグインAと呼ぶ)をドメインエンティティとオプションのエンティティ(プラグインB)を持つもう1つのプラグインを持っています。プラグインBには、2つのデータソース(デフォルトはdataSourcedataSource_redshift)の定義もあります。私のアプリケーションでは、最初に私はプラグインBに依存しており、問題なく両方のデータソースを使用することができます。しかし、私は今、うまく機能のように見えるが、場合には、私は、このようなエンティティを作成していますデフォルトのデータソースを自分のアプリケーションとエンティティにdependecyとして、プラグインAを追加しています。アプリケーションの負荷にGrailsプラグインはマルチデータソースにアクセスできない

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でうまくいきます。私に何が足りないか考えてください。

+0

は、私はあなたが使用しているのGrailsのバージョンわからないんだけど、あなたが持っている場合: アプリケーションapp は、プラグインBに依存 あなたがのためのデータソースが含まれているために、アプリケーションのDatasource.groovyを変更する必要が をプラグインに依存しますアプリケーションのDatasource.groovyが使用されているファイルであるため、 'dataSource_redshift' – adamcooney

+0

@adamcooney、実際のアプリは既に問題なくdataSource_redshiftにアクセスできます(このデータソースへの直接呼び出しを実行するコードがいくつかありますが)dataSource_redshiftにマッピングされているプラ​​グインAのエンティティは使用できません。だから私はすでにDatasource.groovyを正しく設定していると思います。 – sphinks

+0

データソースの名前だけが必要です。これは、次に 'dataSource_redshift'をルックアップします '静的マッピング= { データソース "dataSource_redshift" }' に '静的マッピングが= { データソース "赤方偏移" }' を変更します。 – adamcooney

答えて

0

私はこのような問題の根本原因を発見しました。 Plugin Bが名前でアプリのための2番目のデータソースを有効または無効にする特殊な構造を持っている:

switch(app_name) { 
    ... 
    case 'main_app': 
     redshiftEnabled = true 
    ... 
} 

赤方偏移のデータソースは、私のメインのアプリのために有効になりますが、データソースは、私が予想通りのプラグインのために透明でないように思えるされます。データソースを持つplugin Bがメインアプリに依存するとして追加された場合、アプリプラグインに接続されている他のアプリは第2のデータソースにアクセスすることができません。私は、明示的にデータソースとプラグインであり、個人の名前でプラグインを列挙する必要があります。

switch(app_name) { 
    ... 
    case 'main_app': 
     redshiftEnabled = true 
    case 'plugin_A': 
     redshiftEnabled = true 
    ... 
} 

私はむしろプラグインはメインのアプリに接続された後、彼らは、メインアプリの名前とデータ・ソースにアクセスすることを期待したいが、そうですそうではないように。

関連する問題