6

我正在尝试实现一个自定义 JSP 标记,该标记接受Collection对象的属性 a 并将它们输出为 JSON 格式的数组(每个对象都Collection提供了一个getJsonString()返回该对象的 JSON 格式表示的方法)。我的标签是这样实现的:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="objects" required="true" rtexprvalue="true" %>
<c:set var="output" value="" />
<c:forEach var="obj" items="${objects}">
    <c:if test="${! empty showComma}">
        <c:set var="output" value="${output}, " /> 
    </c:if>
    <c:set var="output" value="${output}${obj.jsonString}" />
    <c:set var="showComma" value="yes" />
</c:forEach>
[${output}]

...并且我希望能够通过执行以下操作来使用它:

<myTaglib:jsonArray objects="${myCollection}" />

但是,当我尝试使用该标签时,我得到一个堆栈跟踪信息:

javax.el.PropertyNotFoundException: Property 'jsonString' not found on type java.lang.String

所以它在抱怨${obj.jsonString}表达,但我绝对没有传递Collection字符串。此外,如果我将其更改为${obj}我看到输出的对象类型正确,并且如果我将自定义标记的代码复制/粘贴到我想要使用它的 JSP 中,它会正常工作,所以我真的不确定是什么在这里进行。

我认为我如何将其传递Collection到自定义标签中存在一些问题,但我无法弄清楚它是什么。有任何想法吗?

4

1 回答 1

6

我找到了解决方案,我需要添加type="java.util.Collection"到属性声明中,如下所示:

<%@ attribute name="objects" required="true" rtexprvalue="true" type="java.util.Collection" %>

...我原以为 Java 会足够聪明,可以自己解决这个问题,但显然不是。

于 2011-06-10T01:12:17.050 回答