gpt4 book ai didi

java - MVEL 无法按空比较的要求工作

转载 作者:行者123 更新时间:2023-12-01 22:31:55 27 4
gpt4 key购买 nike

根据 [ http://mvel.codehaus.org/Value+Emptiness 中的 MVEL 文档]

empty

如果满足以下条件,则应评估为 true。

字符串的长度大于 0,但仅由空格组成

boolean 值是 false

数值为 0

但是它没有给出期望的结果。

  1. 当字符串长度>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. 对于 boolean 值,无论 boolean 值如何,它都会评估为 false(下面给出使用的代码);

    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

为什么它不能按照文档工作?

最佳答案

这三个问题都与 MVEL 问题有关。

对于Q1和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和Q2中质疑的案例。

Q3,表达式integerValue ==空

MVEl 尝试将 empty 转换为 Number,控制权交给此类 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 + "]");

}

在 Debug模式下观察值,

Object in - BlankLiteral
int type - 200

200 只是 DataTypes.EMPTY ,目前 MVEL 不处理它。因此,由于没有大小写匹配,因此会抛出异常。

所以“空”仍然在 MVEL 中没有完全实现

关于java - MVEL 无法按空比较的要求工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com