2012-04-05 2 views
0

Ich habe ein Map in Java, die eine andere Map enthält, etwa so:Kann Zugriff Karte nicht in einer Karte JSTL mit

Map<String, Map<String, Object>> myMap = ... 

Ich verstehe das nicht ein idealer Weg ist, um Daten zu übergeben, aber den Zweck zu testen, es ist einfacher als das Ausfüllen von Klassen, die nur zum Übertragen von Daten an JSTL verwendet werden.

Das heißt worden sind, können wir keine Werte in der zweiten Ebene Map erhalten:

${ myMap[someString1][someString2] != null } 

Es verursacht einen Kompilierungsfehler, wenn die Seite geladen wird:

org.apache.jasper.JasperException: /mypage.jsp (line: 142, column: 9) "${ myMap[someString1][someString2] != null }" contains invalid expression(s): javax.el.ELException: Failed to parse the expression [${ myMap[someString1][someString2] != null }] 
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) 

Merkwürdiger, funktioniert es auf der Maschine, auf der Tomcat 6.0.29 ausgeführt wird, und schlägt auf einem Computer, auf dem 7.0.26 ausgeführt wird, fehl.

Bearbeiten: Die Webanwendung verwendet JSTL-1.2 in beiden Fällen.

Antwort

0

Entpuppt sich als eine facepalm Antwort. Ich änderte die Variablennamen, um den Zweck des Codes zu verschleiern, und dachte, dass es die Dinge verständlicher machen würde, wenn es das Problem tatsächlich maskierte.

Der ursprüngliche Code:

<c:forEach items="${someobject.items}" var="interface"> 
    ... 
    ${ myMap[interface][someString2] != null } 
    ... 
</c:forEach> 

Hinweis der Variablenname für die forEach Schleife - interface natürlich ist ein reservierter Java-Schlüsselwort, aber der Stack-Trace eine sehr gute Arbeit bei der die Aufmerksamkeit auf dieses nicht taten .

Das Ändern des Variablennamens auf interfaze oder irgendetwas anderes behebt das Problem.