GeezerVison is showing github.com — 远程函数:getArgVal 新增支持传 Class<T> 返回指定类型,解决用缺省相对路径从当前请求的全局对象及 Parser 全局缓… · cloudAndMonkey/APIJSON@c8c3b92
File treeExpand file treeCollapse file tree Open diff view settings APIJSONORM/src/main/java/apijson/orm
Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: APIJSONORM/src/main/java/apijson/orm/AbstractFunctionParser.java +22-6Lines changed: 22 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 21 | 21 | import java.util.*; | 22 | 22 |
| 23 | 23 | import static apijson.orm.AbstractSQLConfig.PATTERN_SCHEMA; | | 24 | +import static apijson.orm.SQLConfig.TYPE_ITEM; | 24 | 25 |
| 25 | 26 | /**可远程调用的函数类 | 26 | 27 | * @author Lemon | @@ -156,28 +157,39 @@ public AbstractFunctionParser setCurrentObject(@NotNull JSONObject currentObject | 156 | 157 | return this; | 157 | 158 | } | 158 | 159 |
| 159 | | - /**根据路径从当前对象取值 | | 160 | + /**根据路径取值 | 160 | 161 | * @param path | 161 | 162 | * @return | 162 | 163 | * @param <T> | 163 | 164 | */ | 164 | 165 | public <T extends Object> T getArgVal(String path) { | 165 | | - return getArgVal(path, true); // 误判概率很小 false); | | 166 | + return getArgVal(path, null); // 误判概率很小 false); | | 167 | + } | | 168 | + /**根据路径取值 | | 169 | + * @param path | | 170 | + * @param clazz | | 171 | + * @return | | 172 | + * @param <T> | | 173 | + */ | | 174 | + public <T extends Object> T getArgVal(String path, Class<T> clazz) { | | 175 | + return getArgVal(path, clazz, true); | 166 | 176 | } | 167 | 177 | /**根据路径取值 | 168 | 178 | * @param path | | 179 | + * @param clazz | 169 | 180 | * @param tryAll false-仅当前对象,true-本次请求的全局对象以及 Parser 缓存值 | 170 | 181 | * @return | 171 | 182 | * @param <T> | 172 | 183 | */ | 173 | | - public <T extends Object> T getArgVal(String path, boolean tryAll) { | 174 | | - T val = getArgVal(getCurrentObject(), path); | | 184 | + public <T extends Object> T getArgVal(String path, Class<T> clazz, boolean tryAll) { | | 185 | + T val = getArgVal(getCurrentObject(), path, clazz); | 175 | 186 | if (tryAll == false || val != null) { | 176 | 187 | return val; | 177 | 188 | } | 178 | 189 |
| 179 | 190 | Parser<?> p = getParser(); | 180 | | - return p == null ? null : (T) p.getValueByPath(path); | | 191 | + String targetPath = AbstractParser.getValuePath(getParentPath(), path); | | 192 | + return p == null ? null : (T) p.getValueByPath(targetPath); | 181 | 193 | } | 182 | 194 | /**根据路径从对象 obj 中取值 | 183 | 195 | * @param obj | @@ -186,7 +198,11 @@ public <T extends Object> T getArgVal(String path, boolean tryAll) { | 186 | 198 | * @param <T> | 187 | 199 | */ | 188 | 200 | public static <T extends Object> T getArgVal(JSONObject obj, String path) { | 189 | | - return AbstractParser.getValue(obj, StringUtil.splitPath(path)); | | 201 | + return getArgVal(obj, path, null); | | 202 | + } | | 203 | + public static <T extends Object> T getArgVal(JSONObject obj, String path, Class<T> clazz) { | | 204 | + Object v = AbstractParser.getValue(obj, StringUtil.splitPath(path)); | | 205 | + return clazz == null ? (T) v : TypeUtils.cast(v, clazz, ParserConfig.getGlobalInstance()); | 190 | 206 | } | 191 | 207 |
| 192 | 208 |
| |
Collapse file Copy file name to clipboardExpand all lines: APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java +2-2Lines changed: 2 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -482,7 +482,7 @@ else if (isPlus) { | 482 | 482 | } | 483 | 483 |
| 484 | 484 | if (isPlus == false && isTable == false) { | 485 | | - parseFunction(key, k, (String) value, parentPath, name, request, isMinus); | | 485 | + parseFunction(key, k, (String) value, this.type == TYPE_ITEM ? path : parentPath, name, request, isMinus); | 486 | 486 | } | 487 | 487 | else { | 488 | 488 | //远程函数比较少用,一般一个Table:{}内用到也就一两个,所以这里循环里new出来对性能影响不大。 | @@ -958,7 +958,7 @@ public void onFunctionResponse(String type) throws Exception { | 958 | 958 | JSONObject json = isMinus ? sqlRequest : response; // key-():function 是实时执行,而不是在这里批量执行 | 959 | 959 |
| 960 | 960 | for (Entry<String, String> entry : functionSet) { | 961 | | - parseFunction(entry.getKey(), entry.getKey(), entry.getValue(), parentPath, name, json, isMinus); | | 961 | + parseFunction(entry.getKey(), entry.getKey(), entry.getValue(), this.type == TYPE_ITEM ? path : parentPath, name, json, isMinus); | 962 | 962 | } | 963 | 963 | } | 964 | 964 | } | |
|