spring - 使用 @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.IllegalStateException:无法将类型“java.lang.String”的值转换为所需类型“groovy.lang.Closure”:找不到匹配的编辑器或转换策略
我不确定我正在尝试做的事情是否可能,但以防万一有人对更好的方法或解决方法有任何想法,那就太好了!
解决方案
我无法让它工作,所以我通过使用@ConfigurationProperties
注释来解决它。
我将以下指南应用于我的类似案例; https://guides.grails.org/grails-configuration-properties/guide/index.html
但注意到以下可能对其他人有所帮助的观察结果;
- 如果您在 Grails 目录结构之外创建配置类,请确保在 resources.groovy 中注册 bean
- 您必须为前缀使用小写值,
datasource
否则您将收到错误消息。尽管这仍将与dataSource
您的属性中的配置绑定。 - 闭包配置不能嵌套,并且必须位于顶层,以便可以这样指定它的类型。
例如,例如;
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 的经验。我不会将此标记为答案(因为它不会直接回答问题),但我想贡献它,以防它帮助与我处于相同情况且解决方法令人满意的其他人。
推荐阅读
- amazon-web-services - 用于转换隐藏式字幕文件的 AWS 服务
- python - 多个条件查询表时出错
- html - 矩阵外的 CSS 网格文本
- python - 无法使用 python 烧瓶代码从 AWS 机器对容器运行 CURL
- html - 如何在占位符中添加红色星号?
- reactjs - 具有创建反应应用程序的代理 - 如何配置它?
- spring-security - Spring 的 Security ReactiveAuthenticationManager 不处理 Redis 异步调用以检查令牌撤销
- javascript - 如何获取网站上列出的所有标题标签
- javascript - React:子组件使用 Props 接收多个映射数据失败
- ios - 斯威夫特 | UICollectionView 问题