- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 [ http://mvel.codehaus.org/Value+Emptiness 中的 MVEL 文档]
empty
如果满足以下条件,则应评估为 true。
字符串的长度大于 0,但仅由空格组成
boolean 值是 false
数值为 0
但是它没有给出期望的结果。
当字符串长度>0但仅包含空格时,对于字符串大小写条件计算结果为 false(使用的代码如下)。
String stringValue=" ";
Map<String,Object> contextMap=new HashMap<String, Object>();
contextMap.put("stringValue", stringValue);
System.out.println(MVEL.eval("stringValue == empty",contextMap));
对于 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));
它在比较整数时显示错误。代码:
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/
我有一个 JAVA 类,它有两个方法。第一个是主要方法,第二个是 method1()。 假设以下是类: public class SomeClass() { public static void
我有一个 JAVA 类,它有两个方法。第一个是 main 方法,第二个是 method1()。 假设以下是该类: public class SomeClass() { public static
我在 MVEL 中创建了一个 map ,我必须使用 foreach 对其进行迭代。我该怎么做? 还有一个类似的问题: How to iterate over a map in mvel但在那种情况下,
我看到 MVEL 支持 for 循环和 foreach 模板,但如何从循环中“中断”或“继续”? 最佳答案 文档中没有提及对“中断”或“继续”的支持:http://mvel.codehaus.org/
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
根据 [ http://mvel.codehaus.org/Value+Emptiness 中的 MVEL 文档] empty 如果满足以下条件,则应评估为 true。 字符串的长度大于 0,但仅由空
MVEL 使得向解析器上下文提供自定义函数变得非常容易,但尚不清楚是否有“官方”方法来重载运算符的求值方式。我想到了两个具体的用例: 对数组执行算术应该将操作映射到数组的每个元素上,这样: [1,2,
我想将 MVEL 包含到另一个 MVEL 文件中,我尝试使用 @Include 但它对我不起作用, 任何人都可以建议我如何在另一个 MVEL 文件中使用 MVEL 这是我的代码 Dear @{FIRS
有人知道如何调整 MVEL 以使用不区分大小写的比较吗? Map map = new HashMap<>(); map.put("Name", "Igor"); String property = "
我们目前正在构建自己的产品和框架。我们有一个规则引擎,内部使用 MVEL API 来计算表达式。 最近我们遇到了一个问题 假设我有一个“规则”,其中有很多嵌套的条件。 ( A && ( B && (
我有这个类层次结构 学生类.java public class StudentClass { private List studentList; public List getStud
有没有办法让 MVEL 2.0 ( http://mvel.codehaus.org/ ) 与带有可选参数的函数一起工作? 我希望能够评估这个: trunc('blahblah',2) 还有 trun
我在我的 Java 代码中有预定义的变量,我想在 MVEL 表达式中使用这些变量。我不想传递上下文。 String Col1 = "C"; String Col2 = "D"; String expr
我的类路径中有一个 approprivate jar, org.mvel mvel2 2.4.4.Final jar
当 HashMap 中的顶级键可能存在也可能不存在时,如何解决 PropertyAccessExceptions? 在下面的示例中,如果属性存在,它就可以正常工作,但如果变量映射中不存在该属性,则会抛
我在我的 Java 代码中有预定义的变量,我想在 MVEL 表达式中使用这些变量。我不想传递上下文。 String Col1 = "C"; String Col2 = "D"; String expr
如何在 MVEL 中将字符串转换为整数 Props['MyInteger'] = java.lang.Integer.ParseInt('//某个字符串的 xpath') 其他 java 类型在我的代
我需要计算 MVEL 中包含日期的表达式。基本上,我需要向给定日期添加一定的天数并获取值。当我尝试评估 MVEL 中的表达式时,出现一些异常。 这是我的代码:: package Mvel; impor
对象 obj=帐户;这里的帐户对象包含书籍作为内部对象。那么我如何访问 mvel 中的这些值。 我是 MVEL 新手。那么您能否建议我如何克服上述问题。 最佳答案 MVEL 适用于 OGNL。 假设A
如果我在 MVEL 中有这个脚本: myString = null; if (myString == "Foo") { return true; } 我会在这个脚本中得到一个空指针吗? 因为我
我是一名优秀的程序员,十分优秀!