Accès interdit à java.util.HashMap $ Entry avec les modificateurs “public final”

Mon problème est que mon application fonctionne correctement localement sur le serveur Tomcat, mais génère des erreurs sur le serveur avec Glassfish installé. Tout le problème est que je suis itéré en regardant à travers HashMap dans JSTL. Le serveur jette une stack comme ci-dessous:

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) 

le problème est causé par le code:

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

HashMap element.getPreparedParameters() renvoie HashMap .

Comment puis-je le faire fonctionner?

Découvrez ce bogue vieux de plusieurs décennies signalé à Sun contre Java 1.2. Je me souviens avoir vu cette erreur auparavant et le message est trompeur: le problème ne réside pas avec les modificateurs de méthode, mais avec les modificateurs de la classe propriétaire. Map.Entry est une interface publique, mais la classe d’implémentation dans HashMap est privée. Reflection ne vous permet pas d’accéder aux méthodes de la classe même si vous accédez à des méthodes qui implémentent une interface publique.

Je suggérerais de rechercher une solution de contournement peu coûteuse: n’effectuez pas une itération sur entrySet , mais sur le keySet et utilisez map.get(key) au lieu de entry.getValue() .