比较表达式语言中的字符串和布尔值
我有这种行为,我真的不明白
${someVar} ${someVar.class.name} ${someVar == 'error'}
输出
false java.lang.Boolean true
- 怎么可以解开?
- 编写测试的正确方法是什么,以便首先测试两个“事物”是否具有相同类型,然后它们的值是否相同?
这是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