如何在XML中编写嵌套的SpEL表达式



我正在尝试使用下面这样的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";

类似地,您需要将其写入#{}中,并进行一些更改:

  1. 用单引号替换双引号

  2. 类名应替换为完全限定的类名

  3. 在访问类中的任何常量之前,用T()包装完全限定类名。

希望这能有所帮助

最新更新