无法访问带有修饰符“public final”的java.util.HashMap $ Entry

我的问题是,我的应用程序在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) 

问题是由代码引起的:

  documents["${i.index}"]["param"]=new Array(); documents["${i.index}"]["param"]["key"] = "${parametr.getKey()}"; documents["${i.index}"]["param"]["value"] = "${parametr.getValue()}";  

其中element.getPreparedParameters()返回HashMap

我怎样才能让它发挥作用?

查看Sun针对Java 1.2报告的这个几十年前的错误 。 我记得之前看到过这个错误并且消息有误导性:问题不在于方法修饰符,而在于拥有类的修饰符。 也就是说, Map.Entry是一个公共接口,但HashMap的实现类是私有的。 即使您正在访问实现公共接口的方法,Reflection也不允许您访问类的方法。

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