스프링 2.0 컨트롤러 방법에서 현재 서블릿 컨텍스트에 어떤 URL이 매핑되어 있는지 아는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/413799

  •  03-07-2019
  •  | 
  •  

문제

스프링 2.0에서는 컨트롤러 메소드 내부에서 현재 서블릿 컨텍스트의 매핑 된 URL 목록을 빠르게 할 수있는 방법이 있습니까?

나는라는 메소드를 쓰고있다 getMappedUrls(), 이 방법의 목적은 현재 서블릿 컨텍스트에 맵핑되는 URL을 보여주는 것입니다.

이 방법은 사용 가능한 서비스의 작은 온라인 문서를 생성하는 데 사용됩니다.

감사!

편집하다

Kent Lai의 답변은 저에게 효과가 있습니다.

final Map<Object, AbstractUrlHandlerMapping> beans =
    getApplicationContext().getBeansOfType(AbstractUrlHandlerMapping.class);
for (final AbstractUrlHandlerMapping bean : beans.values())
{
    final Map<String, Object> mapping = bean.getHandlerMap();
    for(final String url : mapping.keySet())
        urls.add(url);
}
도움이 되었습니까?

해결책

이것은 흥미로운 아이디어처럼 들리므로 Spring Web MVC 소스 코드 내부를 파고 방법이 있는지 알아 냈습니다.

먼저 스프링 프레임 워크 로깅 (log4J)에 대한 디버그를 켜고 org.springframework.web.servlet.mvc.annotation.defaultannotationhandlermpapping 클래스에서 매핑이 완료된 것을 발견했습니다 (사용하기 때문에).

FURTHUR 파기, 모든 핸들러 매핑이 핸들러 맵에 추가되는 것을 알았습니다.

당신이 그것에서 파생 된 핸들러를 사용하고 있다고 가정합니다.

다음으로 Dispatcherservlet은 URL을 해결하기 위해 AbstractUrlHandlerMpapping (및 AbstracthAndLermpapping)이 구현하는 핸드 핑을 사용하고 있음을 알게됩니다 (분명히 사용해야 함). DispatcherServlet은 다른 핸들 맵핑 목록을 보유하고 있음이 밝혀졌습니다.

org.springframework.web.servlet.dispatcherservlet#handlermappings

여기서 나쁜 소식은 보호 된 클래스 인스턴스 변수입니다.

따라서 모든 맵핑 된 URL을 찾기 위해 할 수있는 최선의 권장 사항 (이것이 최선으로 고려 될 수있는 경우)은 다음과 같습니다.

  1. ApplicationContext 인스턴스를 보유하십시오.
  2. 최소한 type attracturlhandlermpapping의 모든 콩을 찾으십시오.
  3. 목록을 반복하고 gethandlermap을 호출하고 매핑 된 URL 인 모든 키 세트를 가져옵니다.

이것은 @requestmapping 주석을 사용하여 파는 것입니다. 스프링 구성 파일에서 URL을 매핑하는 경우 얼마나 다른지 잘 모르겠습니다.

다른 팁

서블릿 사양은이 정보를 서블릿 코드에서 숨 깁니다. 현재 요청에 사용 된 컨텍스트 경로 만 얻을 수 있습니다. Web.xml에 도달 할 수 있다면 거기에서 매핑을 유추 할 수 있지만 약간의 해킹입니다. 스타트 업시 각 서블릿 등록 자체를 가질 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top