【问题标题】:Binding a property using @Value to a closure in Grails使用 @Value 将属性绑定到 Grails 中的闭包
【发布时间】:2020-03-19 16:07:44
【问题描述】:

我有一个 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”:找不到匹配的编辑器或转换策略

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

【问题讨论】:

  • 当然,我真的理解为什么会抛出错误。闭包类型不存在转换策略。我想弄清楚的是,是否有人知道这是否可以实现?

标签: spring grails groovy properties binding


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多