我正在尝试实现一个自定义JSP标记,该标记接受Collection
个对象作为属性,并将它们输出为JSON格式的数组(Collection
中的每个对象提供{{1}返回该对象的JSON格式表示的方法。我的标签实现如下:
getJsonString()
...我希望能够通过以下方式使用它:
<%@ 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
,我会看到输出正确的对象类型,如果我将自定义标记的代码复制/粘贴到我想要使用它的JSP中,它可以正常工作,所以我'我真的不确定这里发生了什么。
我认为我将${obj}
传递给自定义标记存在一些问题,但我无法弄清楚它是什么。有什么想法吗?
答案 0 :(得分:6)
我找到了解决方案,我需要将type="java.util.Collection"
添加到属性声明中,如:
<%@ attribute name="objects" required="true" rtexprvalue="true" type="java.util.Collection" %>
......我本以为Java会足够聪明,可以自己解决这个问题,但显然不是。