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代わりにkeySet使用してください。map.get(key)entry.getValue()

別の方法は、Java11以降に更新することです。

于 2012-08-20T13:06:00.117 に答える