JSP / JSTL: передача коллекции пользовательскому тегу

#jsp #jstl #jsp-tags #custom-tag

#jsp #jstl #jsp-теги #пользовательский тег

Вопрос:

Я пытаюсь реализовать пользовательский тег 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 в пользовательский тег, но я не могу понять, в чем дело. Есть идеи?

Ответ №1:

Я нашел решение, мне нужно было добавить type="java.util.Collection" к объявлению атрибута, как в:

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

…Я бы подумал, что Java будет достаточно умной, чтобы разобраться с этим самостоятельно, но, видимо, нет.