簡體   English   中英

Mvel評估

[英]Mvel evaluation

問題陳述:假設我有一個表達式(a + b + c) ,我想計算它的值並分配給某個變量。 后來我想在其他邏輯中使用該變量值。 這一切都是通過MVEL完成的。 問題是如果(a,b,c)任何(a,b,c)null ,MVEL將以字符串格式進行求值。

所以為了避免這種情況,我創建了自己的函數來傳遞每個對象,如果它是null,則將其設為零。

示例代碼如下

public class MvelTest {

    public static void main(String[] args) {

        Map map = new HashMap();

        VariableResolverFactory functionFactory = new MapVariableResolverFactory(map);
        MVEL.eval("checkNullValue = def (x) { x == null ? 0 : x };", functionFactory);

        map.put("a", null);
        map.put("b", 1);
        map.put("c", 1);

        Serializable str = MVEL.compileExpression("( ( checkNullValue(a) + checkNullValue(b) + checkNullValue(c) ) > 2 ) ? d=2 : d=3");

        MVEL.executeExpression(str, map, functionFactory);
        System.out.println(map);
        System.out.println(map.get("d"));
    }
}

產量

{checkNullValue=function_prototype:null, b=1, c=1, a=null}
null

我無法在這里得到"d"值,如果我刪除了工廠和空檢查功能,它的行為和我能夠得到"d"的值。 但是我必須使它對算術運算是安全的,因為MVEL無法處理這個問題。

另外(null * 23) ,MVEL返回false

問題出在您的三元運營商身上。 我不知道MVEL如何評估那些(你使用它們會在Java中非法的方式),但它似乎是把分配在當時的/其他部分不工作......或者說,它(無論何種原因) 為'then'部分工作(在:之前),但在'else'部分工作(在:之后)。

因此,如果總和> 2它是否有效,無論您是否使用空檢查功能,否則它將失敗。

你應該修復你的表達式並將賦值放在三元運算符的前面:

MVEL.compileExpression("d = cnv(a) + cnv(b) + cnv(c) > 2 ? 2 : 3")

更新:通常,這是我觀察到的,獨立於abccnv

MVEL.compileExpression("true  ? d=1 : d=2"); // d ends up as 1
MVEL.compileExpression("false ? d=1 : d=2"); // d is null / unknown
MVEL.compileExpression("d = guard ? 1 : 2"); // always works

問題得到解決,我實際上是為VariableResolverFactory創建靜態引用,並且每次評估都引用相同的內容,我將其更改為每次執行的新實例並且它有效。

 public VariableResolverFactory getMvelFactory(Map contextMap) {
        VariableResolverFactory functionFactory = new MapVariableResolverFactory(contextMap);
        MVEL.eval("checkNullValue = def (x) { x == null ? 0 : x };", functionFactory);

        return functionFactory;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM