我有一个应用程序,其中一些配置存储在数据库中,启动时它们被注入配置对象。 它们的存储方式是object path
字符串,如:"some.config.value"
。Groovy绑定:rebind值
所以解析后,就变成这个样图: [some: [config: [value: [:]]]]
我实现了这个使用Binding
,这里是代码:
Binding bind = new Binding()
bind.tmp = bean // Bean is an object where it is being injected
String[] traverse = stringPath.split(/\./)
def shift = bind.tmp
traverse.eachWithIndex { String it, int i ->
if (it) {
if (!(shift instanceof Map)) {
shift = ["$it": [:]] // <-- Doesn't work
} else {
if (!shift?.containsKey(it)) {
// val - is a value to assign to last key in path
shift[it] = (i + 1 == traverse.size()) ? val : [:]
} else if (shift?.containsKey(it) && (i + 1 == traverse.size())) {
shift[it] = val
}
}
shift = shift[it]
}
}
这种方法的问题是,如果我已经定义键绑定,我似乎无法重新定义它(在shift = ["$it": [:]]
)。
例如:如果我有config.val
和config.val.moreConfig
- 则不会分配moreConfig
。
经过一段时间,我只是决定通过在所有路径中自动声明value
键来指定值,但我仍然好奇是否有方法来重新定义绑定中的值?
或者在groovy中通过Binding
声明的值变为可变吗?
更新: bean
是一个哈希映射与硬编码配置。它可能只是一张空白的地图。 基本上我在做的是在那里注入更多有价值的地图。
如果我有值的链条:
"config.some.var" = 10
"config.some.var2" = 20
"config.some.var.more" = 30
会导致:
[config: [
some: [
var: 10,
var2: 20
]
]]
预期的最新数据将被丢弃,因为它的值已经为10
。我想要的是用最新的值覆盖第一个值,同时保持所有其他值处于相同的深度级别。
上面的代码产生如下:
def bean = [someOtherConfig: []]
convert bean, 'config.var', 10
convert bean, 'config.var2', 20
convert bean, 'config.var.more', 30
assert bean == [someOtherConfig: [], config: [var: 10, var2: 20]]
你能提供一个运行的例子,但不工作,因为你想?我不能运行上面的示例,因为我不知道'bean'应该是什么...... – 2012-08-13 11:22:45