我有一个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时的经验。我不会把它标记为答案(因为它不能直接回答问题(,但我想贡献它,以防它能帮助其他与我处境相同的人,解决方法令人满意。