我正在尝试使用下面这样的SpEL表达式,但不起作用。
<intercept-url pattern="/myurl"
access="#{'${perm.status}' == 'secured' ? 'T(XXX.YYY.PermissionsConstants).PERMISSION_NAME' :
'IS_AUTHENTICATED_ANONYMOUSLY'}"/>
如果我用像VIEW_PERM
这样的常数替换T(XXX.YYY.PermissionsConstants).PERMISSION_NAME
,那么它就起作用了。除了固定部分外,其他一切都很好。我也试过#{T(XXX.YYY.PermissionsConstants).PERMISSION_NAME}
,但没有成功。
请给我建议正确的语法。
您应该像#{expression}
一样编写SpEL。
在你的情况下,它应该像
<intercept-url pattern="/myurl"
access="#{'${perm.status}' == 'secured' ? T(XXX.YYY.PermissionsConstants).PERMISSION_NAME :
'IS_AUTHENTICATED_ANONYMOUSLY'}"/>
不要用引号包装T(XXX.YYY.PermissionsConstants).PERMISSION_NAME
,而'${perm.status}'
或任何String
都需要用引号包装。
假设您需要在java类中编写相同的表达式,那么您将编写如下表达式:
@Value("${perm.status}")
String permStatus;
// Inside a method
String expressionValue = == permStatus == "secured" ? PermissionsConstants.PERMISSION_NAME : "IS_AUTHENTICATED_ANONYMOUSLY";
类似地,您需要将其写入#{}
中,并进行一些更改:
用单引号替换双引号
类名应替换为完全限定的类名
在访问类中的任何常量之前,用
T()
包装完全限定类名。
希望这能有所帮助