Java MVEL未按预期进行空比较
根据中的MVEL文件[ 如果下列条件为真,则应计算为真 字符串的长度大于0,但仅由空格组成 布尔值为false 数值为0 但它并没有给出预期的结果Java MVEL未按预期进行空比较,java,comparison,mvel,isnullorempty,Java,Comparison,Mvel,Isnullorempty,根据中的MVEL文件[ 如果下列条件为真,则应计算为真 字符串的长度大于0,但仅由空格组成 布尔值为false 数值为0 但它并没有给出预期的结果 当字符串长度>0但仅由空格组成时,For String case条件的计算结果为false(下面给出了使用的代码) stringValue=”“; Map contextMap=newhashmap(); put(“stringValue”,stringValue); System.out.println(MVEL.eval(“stringValue
stringValue=”“;
Map contextMap=newhashmap();
put(“stringValue”,stringValue);
System.out.println(MVEL.eval(“stringValue==empty”,contextMap));
布尔布尔布尔值=false;
Map contextMap=newhashmap();
put(“booleanValue”,booleanValue);
System.out.println(MVEL.eval(“booleanValue==empty”,contextMap));
Integer integerValue=0;
Map contextMap=newhashmap();
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
线程“main”中出现异常[错误:无法对表达式进行次求值]
[近:{…integerValue==空….}]
^
[第1行第17列]
位于org.mvel2.compiler.AbstractParser.reduce(AbstractParser.java:2653)
位于org.mvel2.compiler.AbstractParser.arithmetricFunctionReduce(AbstractParser.java:2552)
在org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:152)
在org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:49)
位于org.mvel2.MVEL.eval(MVEL.java:165)
位于com.Test1.main(Test1.java:15)
原因:java.lang.RuntimeException:无法转换为数字类型:class org.mvel2.compiler.BlankLiteral[200]
在org.mvel2.math.MathProcessor.getNumber(MathProcessor.java:702)
位于org.mvel2.math.MathProcessor.\u doOperations(MathProcessor.java:214)
在org.mvel2.math.MathProcessor.doOperations上(MathProcessor.java:79)
在org.mvel2.math.MathProcessor.doOperations上(MathProcessor.java:48)
位于org.mvel2.util.ExecutionStack.op(ExecutionStack.java:178)
位于org.mvel2.compiler.AbstractParser.reduce(AbstractParser.java:2593)
…还有5个
为什么它不能按照文档工作?这三个问题都与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 + "]");
}
200只不过是数据类型。EMPTY
当前不由MVEL处理。因此,由于没有匹配的大小写,它会引发异常
因此,仍然“空”在MVEL中没有完全实现,这三个问题都与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 + "]");
}
200只不过是数据类型。EMPTY
当前不由MVEL处理。因此,由于没有匹配的大小写,它会引发异常
因此,仍然“空”在MVEL中没有完全实现,这三个问题都与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 + "]");
}
200只不过是数据类型。EMPTY
当前不由MVEL处理。因此,由于没有匹配的大小写,它会引发异常
因此,仍然“空”在MVEL中没有完全实现,这三个问题都与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 + "]");
}
200只不过是数据类型。EMPTY
当前不由MVEL处理。因此,由于没有匹配的大小写,它会引发异常
因此,仍然“empty”未在MVEL中完全实现
我在提交时添加了空文本缺少的实现部分:
该修复程序将在下一个mvel版本(2.2.3.Final)中提供。感谢您的报告。我在提交时添加了空文本缺少的实现部分:
该修复程序将在下一个mvel版本(2.2.3.Final)中提供。感谢您的报告。我在提交时添加了空文本缺少的实现部分:
该修复程序将在下一个mvel版本(2.2.3.Final)中提供。感谢您的报告。我在提交时添加了空文本缺少的实现部分:
该修复程序将在下一个mvel版本(2.2.3.Final)中提供。感谢您的支持