Est-il possible d'itérer HttpServletRequest.getAttributeNames() plus d'une fois?
J'essaie de connecter le contenu de la HttpServletRequest collection d'attributs. J'ai besoin de le faire lorsque la servlet démarre pour la première fois, et de nouveau à droite avant la servlet est fini. Je fais cela dans une tentative de comprendre un crufty et mal entretenus servlet. Parce que j'ai besoin d'avoir que peu d'impact possible, servlet filtres ne sont pas une option.
Alors, voici le problème. Lorsque la servlet commence, je vais parcourir l'énumération retourné par HttpServletRequest.getAttributeNames(). Cependant, quand j'ai envie de parcourir à nouveau, getAttributeNames().hasMoreElements() renvoie "faux"! Je ne peux pas trouver un moyen de "reset" de l'énumération. Ce qui est pire, c'est que, même si j'ai ajouter des attributs à la collection en utilisant HttpServletRequest.setAttribute(), j'obtiens toujours un résultat "faux" quand j'appelle getAttributeNames().hasMoreElements().
Est-ce vraiment possible? Il n'y a vraiment aucun moyen de faire une itération sur les noms d'attribut plus d'une fois?
À la demande, voici mon code. C'est assez simple, ne pense pas que je suis en train de faire tout drôle de truc.
/**
*
* Returns the contents of the Attributes collection, formatted for the InterfaceTracker loglines
*
*/
@SuppressWarnings("unchecked")
public static String getAttributes(HttpServletRequest request) {
try {
StringBuilder toLog = new StringBuilder();
Enumeration attributeNames = request.getAttributeNames();
while(attributeNames.hasMoreElements()) {
String current = (String) attributeNames.nextElement();
toLog.append(current + "=" + request.getAttribute(current));
if(attributeNames.hasMoreElements()) {
toLog.append(", ");
}
}
return "TRACKER_ATTRIBUTES={"+ toLog.toString() + "}";
}
catch (Exception ex) {
return "TRACKER_ATTRIBUTES={" + InterfaceTrackerValues.DATA_UNKNOWN_EXCEPTION_THROWN + "}";
}
}
Downvoting que c'est juste une erreur de l'utilisateur.
OriginalL'auteur sangfroid | 2010-08-20
Vous devez vous connecter pour publier un commentaire.
Vous devriez peut-être poster le code où vous appelez
HttpServletRequest.setAttribute()
.À ce stade, il semblerait que votre crufty et mal entretenus servlet est la suppression d'attributs entre vos deux appels à
getAttributeNames()
, mais sans aucune des exemples de code c'est difficile à dire.Mise à JOUR
Rien dans votre code est de sauter hors de moi comme étant défectueux... j'ai donc conçu un extrêmement simple de cas de test à l'intérieur de
handleRequest()
et lui a donné un tourbillon (à l'aide de jboss-eap-4.3 dans mon conteneur). J'ai eu pour définir manuellement un attribut d'abord, que ma compréhension des attributs de la requête, c'est qu'ils sont toujours mis de côté serveur (c'est à dire si je ne l'ai pas alors je n'ai pas tout comme la sortie de l'Enumeration
retourné pargetAttributeNames()
était vide).sortie
Alors peut-être que votre conteneur n'est pas de mettre en œuvre
getAttributeNames()
correctement? Peut-être essayer un extrêmement simple test de cas comme le mien directement danshandleRequest()
oudoGet()/doPost()
.peut-être que vous n'avez pas de retour d'appel getAttributeNames la deuxième fois, c'est pourquoi un échantillon complet serait intéressant. et plus qui conteneur de servlet utilisez-vous?
Bon, j'ai trouvé mon problème. Et je me sens un peu idiot, parce que le problème n'avait rien à voir avec HttpServletRequest. Finalement, j'ai remarqué que je n'avais que l'obtention de ce problème dans mon test de l'unité, et pas quand je le fait, couru la servlet. S'avère, j'ai été en utilisant Mockito mal. Donc, même si vous n'avait aucun moyen de trouver la cause de mon problème, il m'a aidé à éliminer HttpServletRequest comme une possibilité. Alors merci!
N'est pas qui, généralement, comment ça se passe? 🙂 Content que l'on pourrait aider (même si indirectement)!
OriginalL'auteur new Thrall