【问题标题】:How to pass an array into SpEL expression within JSP如何将数组传递给 JSP 中的 SpEL 表达式
【发布时间】:2013-11-26 01:29:07
【问题描述】:

我正在尝试使用 SpEL 调用服务类的方法,例如:

<spring:eval expression="@securityService.hasPermissionToAllArray('${data.regionsArray}')" />

其中data是请求范围内的对象,其方法如下:

public String[] getRegionsArray() {
    List<String> regions = new ArrayList<String>();
    regions.add("aaa");
    regions.add("bbb");
    return regions.toArray(new String[]{});
}

并且 securityService 定义了这个方法:

public boolean hasPermissionToAllArray(String []regions) {
    logger.warn("size={} regions='{}' regions[0]={}", regions.length, regions, regions[0]);
    return true;
}

这是记录器的输出:

size=1 regions='[[Ljava.lang.String;@13299648]' regions[0]=[Ljava.lang.String;@13299648

所以看起来 getRegionsArray() 的返回值被转换为字符串,然后作为数组的第一个元素传递给 hasPermissionToAllArray()。

如果我将数组值转换为字符串,如下所示:

        <c:set var="r" value="${fn:join(data.regionsArray, ',')}" />
        <spring:eval expression="@securityService.hasPermissionToAllArray('${r}')" />

这是日志输出:

size=2 regions='[aaa, bbb]' regions[0]=aaa

但是,显然这并不理想。

注意:尝试使用 List 代替数组,结果相同。

【问题讨论】:

  • 你试过&lt;spring:eval expression="@securityService.hasPermissionToAllArray(${data.regionsArray})" /&gt;吗?

标签: java spring jsp spring-el


【解决方案1】:

在 JSP 中,像 ${something} 这样的表达式将由 EL 解析器解析,无论它在哪里。它不是由 Spring 的表达式语言处理的。因此,expression 将始终解析为类似

@securityService.hasPermissionToAllArray('[Ljava.lang.String;@56165397')

不管引号。

幸运的是,您可以使用requestScope 访问请求(和其他范围)属性。

因此,将您的 expression 更改为以下内容

<spring:eval expression="@driver.hasPermissionToAllArray(requestScope.data.regionsArray)" />

或者干脆

<spring:eval expression="@driver.hasPermissionToAllArray(data.regionsArray)" />

如果该属性可能在任何页面、请求、会话或应用程序范围内。

【讨论】:

    【解决方案2】:

    如果你尝试会发生什么:

    <spring:eval expression="@securityService.hasPermissionToAllArray(${data.regionsArray})" />
    

    ?

    请注意,${data.regionsArray} 周围没有单引号。我怀疑你得到一个字符串是因为你引用了数组。

    【讨论】:

    • 无论引号如何,JSP 中的任何${} 表达式都由 EL 解析器解析。
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2021-12-10
    • 2019-12-13
    • 2010-11-14
    相关资源
    最近更新 更多