如何在grails 3

时间:2016-02-16 16:17:51

标签: grails

我正在尝试遵循此URI中列出的指南:https://grails.github.io/grails-doc/latest/guide/single.html#multipleDatasources

我的application.yml文件,包含以下数据源描述:

dataSources:
    dataSource:
        pooled: true
        jmxExport: true
        driverClassName: org.h2.Driver
        username: sa
        password:
    raw:
        dialect: org.hibernate.dialect.Oracle10gDialect
        driverClassName: oracle.jdbc.driver.OracleDriver
        username: rip
        password: password
        dbCreate: validate
        url: jdbc:oracle:thin:@127.0.0.1:345:coolio

environments:
    development:
        dataSources:
            dataSource:
                dbCreate: create-drop
                url: jdbc:h2:mem:devDb;MVCC=TRUE
    test:
        dataSources:
            dataSource:
                dbCreate: update
                url: jdbc:h2:mem:testDb;MVCC=TRUE
    production:
        dataSources:
            dataSource:
                dbCreate: update
                url: jdbc:h2:mem:prodDb;MVCC=TRUE

在我的DatabaseService中,我有以下代码来尝试并注入dataSource bean:

class DatabaseService {

    static datasource = 'raw'
    DataSource dataSource

    public void testMyDb(User user) {
        try {
            println("we are in here with : " +    dataSource.getConnection().getMetaData().getURL())
            registerUser(new Sql(dataSource), user)
        } catch (SQLException e) {
            LOGGER.error("unable to register the user", e)
            throw e
        }
    }

    public void registerDeveloper(Sql sql, User user) {
            sql.call("{call isertUser(?)}", [user.name])
    }

DatabaseService文件中的print语句打印出来:

    we are in here with : jdbc:h2:mem:testDb

但是,它应该打印出来:

    we are in here with : jdbc:oracle:thin:@127.0.0.1:345:coolio

我做错了什么?为什么原始的Datasource bean是实例化的?

更新的尝试(1):我在这里看到一个好的主题:https://github.com/grails/grails-core/issues/9690,但即使在更换后

 static datasource = 'raw' 

 @Autowired 
 @Qualifier('dataSource_raw')
没有什么变化。如果我抓住Springs ApplicationContext并打印出bean,那么dataSource_raw确实就是其中之一。

更新后的尝试(2):我试图删除整个环境部分,没有任何变化。

2 个答案:

答案 0 :(得分:2)

更新回答:

这似乎是grails 3的错误。不确定它是否已在较新版本中修复(> 3.0.11)。即使我们使用@Autowired and @Qualifier注释指定bean名称,grails也会在dataSource, transactionManager and sessionFactory的情况下注入默认bean。这也可能是其他bean的情况,但我只测试了这三个。我没有测试域或控制器的行为。

要解决此问题,您可以使用自定义名称以及@Autowired and @Qualifier@Resource注释,而不是使用这些默认名称。

通过以下方式,您将获得默认数据源的bean,即使您指定使用其他bean:

@Resource(name = "dataSource_raw")
DataSource dataSource

@Resource(name = "transactionManager_raw")
PlatformTransactionManager transactionManager

@Resource(name = "sessionFactory_raw")
SessionFactory sessionFactory

但是使用自定义名称,将注入使用@Qualifier@Resource指定名称的bean:

@Resource(name = "dataSource_raw")
DataSource rawDataSource

@Resource(name = "transactionManager_raw")
PlatformTransactionManager rawTransactionManager

@Resource(name = "sessionFactory_raw")
SessionFactory rawSessionFactory

答案 1 :(得分:0)

您还可以声明如下

def dataSource_raw

没有@Resource注释