我有一個應用程序,其中一些配置存儲在數據庫中,啓動時它們被注入配置對象。 它們的存儲方式是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