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

T.G*_*T.G 12 java glassfish hashmap

我的问题是,我的应用程序在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) 
Run Code Online (Sandbox Code Playgroud)

问题是由代码引起的:

<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>
Run Code Online (Sandbox Code Playgroud)

哪里有element.getPreparedParameters()回报HashMap.

我怎样才能使它工作?

Mar*_*nik 18

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

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