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

How to write nested SpEL expression in XML

我正在尝试使用如下所示的 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 class 中编写相同的表达式,那么您会这样写:

@Value("${perm.status}")
String permStatus;

// Inside a method
String expressionValue =  == permStatus == "secured" ? PermissionsConstants.PERMISSION_NAME : "IS_AUTHENTICATED_ANONYMOUSLY";

同样需要写在#{}里面,稍作改动:

  1. 用单引号代替双引号

  2. Class 名称应替换为完全限定的 class 名称

  3. 在访问 class.

  4. 中的任何常量之前,用 T() 包装完全限定的 class 名称

希望对您有所帮助!