15

我的问题是,我的应用程序在 Tomcat 服务器上本地运行良好,但在安装 glassfish 的服务器上抛出错误。整个问题是我在 JSTL 中遍历 HashMap。服务器抛出如下堆栈:

Servlet.service() for servlet jsp threw exception java.lang.IllegalAccessException:
Class javax.el.BeanELResolver can not access a member of class java.util.HashMap$Entry with modifiers "public final" 
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261) 
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253) 

问题是由代码引起的:

<c:forEach items="${element.getPreparedParameters()}" var="parametr" varStatus="j">
    documents["${i.index}"]["param"]=new Array();
    documents["${i.index}"]["param"]["key"] = "${parametr.getKey()}";
    documents["${i.index}"]["param"]["value"] = "${parametr.getValue()}";
</c:forEach>

在哪里element.getPreparedParameters()返回HashMap

我怎样才能让它工作?

4

1 回答 1

21

查看这个针对 Java 1.2(已在Java 11中修复)向 Sun 报告的几十年前的错误。我记得之前看到过这个错误,并且该消息具有误导性:问题不在于方法修饰符,而在于拥有类的修饰符。即,是一个公共接口,但其中的实现类是私有的。即使您正在访问实现公共接口的方法,反射也不允许您访问该类的方法。Map.EntryHashMap

我建议寻找一个便宜的解决方法:不要遍历entrySet,而是遍历keySetand 使用map.get(key)而不是entry.getValue().

替代方法是更新到 Java 11 或更高版本。

于 2012-08-20T13:06:00.117 回答