2010-08-20 4 views
4

HttpServletRequest 특성 컬렉션의 내용을 로깅하려고합니다. 서블릿이 처음 시작될 때이를 수행해야하며, 서블릿이 완료되기 전에 다시해야합니다. 난 crufty 및 유지 관리 서블릿을 이해하려고 시도하고있다. 가능한 한 작은 영향을 주어야하기 때문에 서블릿 필터는 옵션이 아닙니다.HttpServletRequest.getAttributeNames()를 여러 번 반복하는 방법이 있습니까?

그래서 여기에 문제가 있습니다. 서블릿이 시작되면 HttpServletRequest.getAttributeNames()가 반환하는 열거를 반복합니다. 그러나 그것을 다시 반복 할 때 getAttributeNames(). hasMoreElements()는 "false"를 반환합니다! 열거 형을 '재설정'할 방법을 찾을 수 없습니다. 더 나쁜 것은 HttpServletRequest.setAttribute()를 사용하여 콜렉션에 속성을 추가하더라도 getAttributeNames(). hasMoreElements()를 호출 할 때 여전히 "false"결과를 얻습니다.

정말 가능한가요? 속성 이름을 두 번 이상 반복 할 방법이 없습니까?

요청하면 여기에 내 코드가 있습니다. 그것은 꽤 직설적입니다. 나는 재미있는 것을하고 있다고 생각하지 않습니다.

/** 
* 
* 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

그래서 서비스 시작/doGet/doPost 메소드에서 getAttributes 메소드를 호출 한 다음 끝에 다시 호출하십시오. rite? – YoK

+0

Downvoting 이것은 단지 사용자 오류입니다. – EJP

답변

16

아마도 HttpServletRequest.setAttribute()이라고하는 곳에 코드를 게시해야합니다.

이 시점에서 귀하의 철저하고 정비가 잘되어 있지 않은 서블릿이 getAttributeNames()에 대한 두 건의 호출 사이에 속성을 제거하고 있지만 코드 샘플이 없어도 말할 수없는 것처럼 보입니다.

업데이트는 코드의 어떠한 결함이있는 나를 밖으로 점프하지

는 ... 그래서 handleRequest() 내부에 매우 간단한 테스트 케이스를 제작하고 제이 보스-EAP-4.3를 사용 (한번 소용돌이를 준 내 컨테이너). 요청 속성에 대한 내 이해가 항상 서버 측에 설정되어 있기 때문에 먼저 속성을 수동으로 설정해야했습니다. 즉 getAttributeNames()이 반환 한 Enumeration이 비어있어 출력을 얻지 못했습니다.

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

도움을 주셔서 감사합니다.하지만 서블릿의 잘못이 아닙니다. 테스트로서, 나는 같은 기능으로 그것을 반복하면서 콜렉션에 속성을 추가하려고 시도했다. 그리고 여전히 hasMoreElements()는 거짓으로 돌아옵니다. – sangfroid

+0

아마도 두 번째로 getAttributeNames를 호출하지 않았으므로 전체 샘플이 흥미 롭습니다. 그리고 어떤 서블릿 컨테이너를 사용합니까? –

+0

그래, 내 문제를 발견했다. 문제는 HttpServletRequest와 아무 관련이 없기 때문에 다소 어리석은 느낌입니다. 결국 서블릿을 실제로 실행했을 때가 아니라 단위 테스트에서이 문제 만 발생한다는 사실을 알게되었습니다. 밝혀 지, 나는 Mockito를 잘못 사용하고 있었다. 그래서 내 문제의 근본 원인을 찾을 수있는 방법이 없더라도 HttpServletRequest를 제거 할 수있었습니다. 감사합니다! – sangfroid

관련 문제