我正在尝试实现一个自定义的JSP标签,该标签接受为属性 Collection 对象并将它们输出为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 进入自定义标签,但我无法弄清楚它是什么。有任何想法吗?

有帮助吗?

解决方案

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

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

...我本来会认为爪哇足够聪明,可以自己弄清楚,但显然不是。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top