diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java
index ecbdb7f8..0a2e0660 100644
--- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java
+++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java
@@ -19,11 +19,6 @@ import java.util.*;
* 2、inx开头的方法,适用于不关心参数名称,根据下标取值。如普通方法参数、sql顺序参数(非具名参数)
* 3、get方法取值,没有委托机制,适用于sql具名参数、bean方法具名参数
* 4、setAlias用于为一个key设置别名,用于解决应用层简化配置,避免冗长的配置名。
- *
- * 注意:
- * 1、对于key来说,key对于所有上层Kv都是可见的。比如kv1设置了key1,kv2的父级是kv1,那么kv2使用key1能够查找到kv1的配置。
- * 2、对于alias来说,与key相反。alias对于所有上层kv是不可见的,除非上层kv再次定义了该alias。
- * 3、所有的key、alias都不区分大小写、忽略-、_符号。
* @author: aoshiguchen
* @date: 2023/3/1
*/
@@ -335,12 +330,28 @@ public class Kv implements Map , Serializable, Cloneable {
return TypeUtil.conversion(get(k, (V)defaultValue), Date.class);
}
+ public K getAlias(K k) {
+ return this.aliasMap.get(convertKey(k));
+ }
+
+ public K stackGetAlias(K k) {
+ K res = getAlias(k);
+ if (null == res && null != parent) {
+ res = parent.stackGetAlias(k);
+ }
+ return res;
+ }
+
// ====== 为了方便取值操作,take开头的方法,全部基于栈式取值 =======
public V take(K k) {
- if (this.aliasMap.containsKey(convertKey(k))) {
- return this.stackGet(this.aliasMap.get(convertKey(k)));
+ V res = null;
+ K aliasK = this.stackGetAlias(k);
+ if (null != aliasK) {
+ res = this.stackGet(aliasK);
+ }
+ if (null == res) {
+ res = this.stackGet(k);
}
- V res = this.stackGet(k);
return res;
}
diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java
index e49f19f8..b31dc254 100644
--- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java
+++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java
@@ -11,7 +11,11 @@ public class KvTest {
@Test
public void test1() {
Object key1 = new Object();
- Kv kv1 = Kv.of()
+ Kv kv0 = Kv.of()
+ .setAlias("app.server.http.http-port", "aaa")
+ ;
+
+ Kv kv1 = Kv.of(kv0)
.set("app.server.http.http-port", 8080)
.set("app.server.http.jks_Path", "/123/456")
.set(key1, 1)
@@ -69,12 +73,11 @@ public class KvTest {
Assert.assertTrue(kv3.takeStr("app.server.http.http-port").equals("8081"));
Assert.assertNull(kv3.take(null));
- // 注意:http-port是第1层设置的别名,因此用这个别名对2、3层不可见,不会指向第二层的8081(除非第2、3层定义了同样的别名)
- Assert.assertTrue(kv3.takeStr("httpPort").equals("8080"));
- Assert.assertTrue(kv3.takeInt("http-port").equals(8080));
- // 注意:第3层设置的别名port,找到第二层的配置,不再往上找
+ Assert.assertTrue(kv3.takeStr("httpPort").equals("8081"));
+ Assert.assertTrue(kv3.takeInt("http-port").equals(8081));
Assert.assertTrue(kv3.takeInt("port").equals(8081));
// 注意:第3层的别名p,指向了第1层的别名http-port
Assert.assertTrue(kv3.takeInt("p").equals(8080));
+ Assert.assertTrue(kv3.takeStr("aaa").equals("8081"));
}
}