2010-08-20 3 views
4

Я пытаюсь зарегистрировать содержимое коллекции атрибутов HttpServletRequest. Мне нужно сделать это, когда сервлет сначала начнется, и снова прямо перед завершением сервлета. Я делаю это, пытаясь понять жестокий и плохо поддерживаемый сервлет. Поскольку я должен иметь как можно меньше влияния, фильтры сервлетов не являются опцией.Есть ли способ перебора через HttpServletRequest.getAttributeNames() более одного раза?

Итак, вот в чем проблема. Когда сервлет запускается, я буду перебирать нумерацию, возвращаемую HttpServletRequest.getAttributeNames(). Однако, когда я хочу повторить его снова, getAttributeNames(). HasMoreElements() возвращает «false»! Я не могу найти способ «перезагрузить» перечисление. Хуже то, что даже если я добавлю атрибуты в коллекцию с помощью HttpServletRequest.setAttribute(), я все равно получаю результат «false», когда я вызываю getAttributeNames(). HasMoreElements().

Действительно ли это возможно? Невозможно ли повторять итерации через имена атрибутов более одного раза?

По запросу, вот мой код. Это довольно просто - не думаю, что я делаю забавные вещи.

/** 
* 
* 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 + "}"; 
    }    
} 
+0

, поэтому вы вызываете метод getAttributes при запуске метода service/doGet/doPost, а затем снова вызываете его в конце, обряде? – YoK

+0

Downvoting, поскольку это всего лишь ошибка пользователя. – EJP

ответ

16

Возможно, вам стоит ввести код, называемый HttpServletRequest.setAttribute().

На данный момент кажется, что ваш жестокий и плохо обслуживаемый сервлет удаляет атрибуты между вашими двумя вызовами до getAttributeNames(), но без каких-либо образцов кода трудно сказать.

UPDATE

Ничто в коде не прыгает на меня как неисправные ... так что я изготовлен очень простой тест, в handleRequest() и дал ему кружить (с использованием JBoss-EAP-4.3, как мой контейнер). Сначала мне пришлось вручную установить атрибут, так как я понимаю атрибуты запроса, они всегда заданы на стороне сервера (т. Е. Если я не установил его, то я не получил никакого вывода, поскольку Enumeration, возвращенный getAttributeNames(), был пуст).

request.setAttribute("muckingwattrs", "Strange"); 

Enumeration attrs = request.getAttributeNames(); 
while(attrs.hasMoreElements()) { 
    System.out.println(attrs.nextElement()); 
} 

System.out.println("----------------------------"); 

Enumeration attrs2 = request.getAttributeNames(); 
while(attrs2.hasMoreElements()) { 
    System.out.println(attrs2.nextElement()); 
} 

выход

INFO [STDOUT] muckingwattrs 
INFO [STDOUT] ---------------------------- 
INFO [STDOUT] muckingwattrs 

Так, возможно, ваш контейнер не реализует getAttributeNames() правильно? Возможно, попробуйте очень простой тестовый пример, например, мой непосредственно в handleRequest() или doGet()/doPost().

+0

Спасибо за помощь, но я знаю, что это не ошибка сервлета. В качестве теста я попытался добавить атрибуты в коллекцию RIGHT AFTER itterating через нее в той же самой функции. И все же hasMoreElements() возвращается false. – sangfroid

+0

Возможно, вы не перезвали getAttributeNames во второй раз, поэтому полный образец был бы интересным. и еще какой контейнер сервлетов вы используете? –

+0

Хорошо, я нашел свою проблему. И я чувствую себя глупо, потому что проблема не имеет ничего общего с HttpServletRequest. В конце концов я заметил, что я только получаю эту проблему в своем модульном тесте, а не когда я на самом деле запускал сервлет. Оказывается, я неправильно использовал Mockito. Поэтому, хотя у вас не было возможности найти основную причину моей проблемы, вы помогли мне исключить HttpServletRequest как возможность. Так что спасибо! – sangfroid

 Смежные вопросы

  • Нет связанных вопросов^_^