首页 > 解决方案 > 使用 @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”:找不到匹配的编辑器或转换策略

我不确定我正在尝试做的事情是否可能,但以防万一有人对更好的方法或解决方法有任何想法,那就太好了!

标签: springgrailsgroovypropertiesbinding

解决方案


我无法让它工作,所以我通过使用@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 的经验。我不会将此标记为答案(因为它不会直接回答问题),但我想贡献它,以防它帮助与我处于相同情况且解决方法令人满意的其他人。


推荐阅读