您可以在 Grails 数据源配置文件中引用远程资源吗?

Can you reference a remote resource in a Grails datasource config file?

我想从远程资源配置 Grails 数据源的 url 属性。 (我想在 etcd 中保留一些信息)。例如像这样:

def jsonSlurper = new JsonSlurper()
def urlConfig = jsonSlurper.parseText(new URL("http://127.0.0.1:2379/v2/keys/dataSource/url").text)
dataSource {
    ....
    url = ${urlConfig.node.value}
}

如果我在启动应用程序时在配置文件中打印 url 值,它会显示预期值。但是使用动态方式出现如下错误:

Caused by: org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: Driver:com.mysql.jdbc.Driver@44a3eec9 returned null for URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000

所以看起来这种方法不加修改就行不通了。那正确吗?即 Grails 目前是否仅支持数据库 URL 值被配置为数据源配置文件中的静态字符串?

我们像这样加载外部数据源配置文件,也许你可以试试。

DataSource.groovy:

import org.springframework.core.io.support.PropertiesLoaderUtils as PLU
import org.springframework.core.io.ClassPathResource as CPR
...
try {
    ConfigObject properties = new ConfigSlurper().parse(PLU.loadProperties(new CPR('DataSource.properties')))
    dataSource.merge( properties.dataSource )
    hibernate.merge( properties.hibernate )
} catch (java.io.FileNotFoundException e){}

DataSource.properties:

dataSource.url = jdbc:oracle:thin:@localhost:1521:orcl
...
hibernate.properties.xxxx = dddd

事实证明你可以。我上面的问题是一个愚蠢的语法错误...将值设置为 url = ${urlConfig.node.value} 而不是 url = urlConfig.node.value