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

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

${someVar} ${someVar.class.name} ${someVar == 'error'} 

输出

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

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

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

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

将A强制转换为布尔值

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

因此,字符串文字通过Boolean.valueOf("error")强制转换为布尔值, 返回false 。

如果EL中的一方是Boolean (或boolean ),而另一方是String ,那么String将被Boolean#valueOf()解析为Boolean ,其中javadoc表示如下:

返回一个Boolean ,其值由指定的字符串表示。 返回的Boolean表示如果字符串参数不为null且等于(忽略大小写)字符串“true”的真值。

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

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

至于第2点。

  ${someVar.class == errorString.class} 

将检查两个“事物”是否是同一个类的实例。

但是将someVar转换为字符串,然后比较两个字符串可能会更好,因为(至少在我的情况下)someVar不能保证是String或Boolean,所以它可以是任何其他可以转换为a的字符串串。

 ${someVar} //${someVar} //${someVar.class} //${someVar == 'error'} 

哪个输出

 //false //class java.lang.String //false