JSP/JSTL: Übergeben einer Sammlung an ein benutzerdefiniertes Tag
-
22-10-2019 - |
Frage
Ich versuche, ein benutzerdefiniertes JSP -Tag zu implementieren, das als Attribut a akzeptiert wird Collection
von Objekten und gibt sie als JSON-formatiertes Array aus (jedes Objekt in der Collection
bietet a getJsonString()
Methode, die eine JSON-formatierte Darstellung dieses Objekts zurückgibt). Ich habe mein Tag als solches implementiert:
<%@ 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}]
... und ich möchte es benutzen können, indem ich so etwas wie:
<myTaglib:jsonArray objects="${myCollection}" />
Wenn ich jedoch versuche, das Tag zu verwenden, bekomme ich eine Stapelverfolgung mit dem Titel:
javax.el.PropertyNotFoundException: Property 'jsonString' not found on type java.lang.String
Es beschwert sich also über die ${obj.jsonString}
Ausdruck, aber ich komme definitiv nicht ein Collection
von Saiten. Außerdem, wenn ich es zu ändere ${obj}
Ich sehe die korrekten Objekttypen, die ausgegeben werden, und wenn ich den Code für mein benutzerdefiniertes Tag in den JSP kopiere/einfüge, funktioniert er richtig. Ich bin mir wirklich nicht sicher, was hier vor sich geht.
Ich nehme an, es gibt ein Problem damit, wie ich das bestehe Collection
in das benutzerdefinierte Tag, aber ich kann nicht herausfinden, was es ist. Irgendwelche Ideen?
Lösung
Ich fand die Lösung, ich musste hinzufügen type="java.util.Collection"
zur Attributerklärung, wie in:
<%@ attribute name="objects" required="true" rtexprvalue="true" type="java.util.Collection" %>
... Ich hätte gedacht, Java wäre klug genug, um das selbst herauszufinden, aber anscheinend nicht.