比较表达式语言中的字符串和布尔值

Pao*_*olo 9 java jsp weblogic el

我有这种行为我真的不明白

${someVar}
${someVar.class.name}      
${someVar == 'error'}
Run Code Online (Sandbox Code Playgroud)

输出

false
java.lang.Boolean
true
Run Code Online (Sandbox Code Playgroud)
  1. 怎么可以解开?
  2. 编写测试的正确方法是什么,以便首先测试两个"事物"是否具有相同类型,然后它们的值是否相同?

McD*_*ell 14

这是EL规范中定义的语言行为:

A {==,!=,eq,ne} B.

  • 其他规则省略了
  • 如果A或B是布尔值,则将A和B强制为布尔值,则应用运算符

将A强制转换为布尔值

  • 如果A为null或"",则返回false
  • 否则,如果A是布尔值,则返回A.
  • 否则,如果A是String,并且Boolean.valueOf(A)不抛出异常,则返回它
  • 否则,错误

因此,字符串文字被强制通过一个布尔Boolean.valueOf("error")返回false.


Bal*_*usC 6

如果EL中的一方是Boolean(或boolean),而另一方是a String,则将通过其javadoc说明以下内容String进行解析:BooleanBoolean#valueOf()

返回Boolean带有指定字符串表示的值的a.在Boolean返回的代表true值,如果字符串参数不null并等于,忽略大小写,字符串"真".

所以,它返回false,这确实等于false.

您需要重写EL表达式以考虑类型可以是布尔值和字符串,或者只是坚持单一类型而不是在单个属性中混合类型.