使用@Value将属性绑定到Grails中的闭包



我有一个Grails插件(4.0.1(,我试图以Grails不可知的方式绑定属性。

我在runtime.groovy中的数据源如下;

dataSource {
dbCreate = 'none'
pooled = true
username = "root"
password = ""
dialect = UTF8MySQL5InnoDBDialect.name
driverClassName = "com.mysql.jdbc.Driver"
properties {
jmxEnabled = false
initialSize = 5
}
remoteDataSources {
disabled = false
urlGenerator = { String host ->
"jdbc:mysql://${host}:3306/myDb?characterEncoding=utf8"
}
}
}

使用Grails方法可以很好地访问上面的配置;

def dbConfig = grailsApplication.config.dataSource
String dbUrl = dbConfig.urlGenerator(thisHost)

但是,当我尝试使用Grails不可知方法(Spring Boot(时,我无法将其绑定;

@Value('${dataSource}')
private Map dataSource

单独访问似乎有效;

@Value('${dataSource.remoteDataSources.disabled}')
private boolean disabled

但主要问题在于关闭;

@Value('${dataSource.remoteDataSources.urlGenerator}')
private Closure urlGenerator

结果为;

java.lang.IollegalStateException:无法将"java.lang.String"类型的值转换为所需的"groovy.lang.Closure"类型:找不到匹配的编辑器或转换策略

我不确定我试图做的事情是否可能,但万一有人有更好的方法或变通方法,那就太好了!

我无法让它工作,所以我改为使用@ConfigurationProperties注释来解决它。

我将以下指南应用于我的类似案例;https://guides.grails.org/grails-configuration-properties/guide/index.html

但注意到以下观察结果可能对其他人有所帮助;

  • 如果在Grails目录结构之外创建配置类,请确保在resources.groovy中注册bean
  • 前缀datasource必须使用小写值,否则会出现错误。尽管这仍然会与属性中的dataSource配置绑定
  • Closure配置不能嵌套,并且必须位于顶层,这样才能指定其类型

例如;

dataSource {
username = 'root'
password = ''
// etc
properties {
jmxEnabled = false
initialSize = 5
}
disabled = false
urlGenerator = { String host ->
"jdbc:mysql://${host}:3306/myDb?characterEncoding=utf8"
}
}

我的班级:

@Configuration
@ConfigurationProperties(prefix = "datasource")
class DataSourceConfiguration {
String username
String password
Map<String, String> properties
boolean disabled
Closure urlGenerator
}

这是我在编写Grails 4.0.1时的经验。我不会把它标记为答案(因为它不能直接回答问题(,但我想贡献它,以防它能帮助其他与我处境相同的人,解决方法令人满意。

最新更新