2014-12-20 35 views
0

作爲每對MVEL的文檔,如果下面提到條件爲真應評估爲真不工作。MVEL如[<a href="http://mvel.codehaus.org/Value+Emptiness" rel="nofollow">http://mvel.codehaus.org/Value+Emptiness</a></p> <pre><code>empty </code></pre> <p>期望空比較

的字符串的長度大於0但只包括空白的

一個布爾值是假

的數值是0

,但它不給出預期的結果。

  1. 對於String長度> 0但僅包含空格(使用的代碼如下所示)時,字符串大小寫條件的計算結果爲false。

    String stringValue="  "; 
    Map<String,Object> contextMap=new HashMap<String, Object>(); 
    contextMap.put("stringValue", stringValue); 
    System.out.println(MVEL.eval("stringValue == empty",contextMap)); 
    
  2. 對於布爾它evalautes假不論布爾值的(代碼使用在下面給出);

    Boolean booleanValue=false; 
    Map<String,Object> contextMap=new HashMap<String, Object>(); 
    contextMap.put("booleanValue", booleanValue); 
    System.out.println(MVEL.eval("booleanValue == empty",contextMap)); 
    
  3. 它顯示比較整數的錯誤。 代碼:

    Integer integerValue=0; 
        Map<String,Object> contextMap=new HashMap<String, Object>(); 
        contextMap.put("integerValue", integerValue); 
        System.out.println(MVEL.eval("integerValue == empty",contextMap)); 
    

錯誤:

Exception in thread "main" [Error: failed to subEval expression] 
[Near : {... integerValue == empty ....}] 
          ^
[Line: 1, Column: 17] 
    at org.mvel2.compiler.AbstractParser.reduce(AbstractParser.java:2653) 
    at org.mvel2.compiler.AbstractParser.arithmeticFunctionReduction(AbstractParser.java:2552) 
    at org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:152) 
    at org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:49) 
    at org.mvel2.MVEL.eval(MVEL.java:165) 
    at com.Test1.main(Test1.java:15) 
Caused by: java.lang.RuntimeException: cannot convert <> to a numeric type: class org.mvel2.compiler.BlankLiteral [200] 
    at org.mvel2.math.MathProcessor.getNumber(MathProcessor.java:702) 
    at org.mvel2.math.MathProcessor._doOperations(MathProcessor.java:214) 
    at org.mvel2.math.MathProcessor.doOperations(MathProcessor.java:79) 
    at org.mvel2.math.MathProcessor.doOperations(MathProcessor.java:48) 
    at org.mvel2.util.ExecutionStack.op(ExecutionStack.java:178) 
    at org.mvel2.compiler.AbstractParser.reduce(AbstractParser.java:2593) 
    ... 5 more 

爲什麼它不工作按文檔?

+0

某些被稱爲「bug」的物種已經在軟件和其他牧場上看到。提交MVEL錯誤報告網站的錯誤報告。 – laune

+0

@laune無法找到任何報告錯誤的鏈接(公開)。如果有鏈接請分享。 –

+0

我開始詢問了。請支持。 – laune

回答

2

這三者都與MVEL問題有關。

對於Q1 and Q2

對於empty運營商,MVEL有一個類BlankLiteral,它有一個方法

public boolean equals(Object obj) { 
    if (obj == null || "".equals(valueOf(obj))) { 
     return true; 
    } 
    else if (isNumeric(obj)) { 
     return "0".equals(valueOf(obj)); 
    } 
    else if (obj instanceof Collection) { 
     return ((Collection) obj).size() == 0; 
    } 
    else if (obj.getClass().isArray()) { 
     return getLength(obj) == 0; 
    } 
    return false; 
    } 

如您在Q1 and Q2質疑其不處理的情況。

Q3,表達integerValue == empty

MVEL試圖鑄造empty到數值,控制涉及到該類MathProcessor.class

方法是

private static Double getNumber(Object in, int type) { 
    if (in == null) 
     return 0d; 
    switch (type) { 
     case BIG_DECIMAL: 
     return ((Number) in).doubleValue(); 
     case DataTypes.BIG_INTEGER: 
     return ((Number) in).doubleValue(); 
     case DataTypes.INTEGER: 
     case DataTypes.W_INTEGER: 
     return ((Number) in).doubleValue(); 
     case DataTypes.LONG: 
     case DataTypes.W_LONG: 
     return ((Number) in).doubleValue(); 
     case DataTypes.STRING: 
     return Double.parseDouble((String) in); 
     case DataTypes.FLOAT: 
     case DataTypes.W_FLOAT: 
     return ((Number) in).doubleValue(); 
     case DataTypes.DOUBLE: 
     case DataTypes.W_DOUBLE: 
     return (Double) in; 
     case DataTypes.SHORT: 
     case DataTypes.W_SHORT: 
     return ((Number) in).doubleValue(); 
     case DataTypes.CHAR: 
     case DataTypes.W_CHAR: 
     return Double.parseDouble(String.valueOf((Character) in)); 
     case DataTypes.BOOLEAN: 
     case DataTypes.W_BOOLEAN: 
     return ((Boolean) in) ? 1d : 0d; 
     case DataTypes.W_BYTE: 
     case DataTypes.BYTE: 
     return ((Byte) in).doubleValue(); 
    } 

    throw new RuntimeException("cannot convert <" + in + "> to a numeric type: " + in.getClass() + " [" + type + "]"); 

} 

觀察在調試模式下的值,

Object in - BlankLiteral 
int type - 200 

200不過是DataTypes.EMPTY,它目前尚未由MVEL處理。所以既然沒有大小寫匹配,就會拋出異常。

所以還是「空」是在MVEL沒有完全落實

相關問題