복붙노트

[SPRING] Spring MVC에서 모든 컨트롤러를 찾는 방법은 무엇입니까?

SPRING

Spring MVC에서 모든 컨트롤러를 찾는 방법은 무엇입니까?

런타임 생성 API 문서를 제공하기 위해 모든 Spring MVC 컨트롤러를 반복하고 싶다. 모든 컨트롤러는 Spring @Controller 어노테이션으로 주석 처리됩니다. 현재 나는 이렇게하고있다 :

for (final Object bean: this.context.getBeansWithAnnotation(
        Controller.class).values())
{
    ...Generate controller documentation for the bean...
}

그러나이 코드의 첫 번째 호출은 매우 느립니다. Spring이 정의 된 빈을 검사하는 대신 클래스 패스의 모든 클래스를 반복하는 지 궁금하다. 위의 코드가 실행될 때 컨트롤러가 이미로드 된 경우 로그는 요청 매핑을 통해 모든 것을 표시하므로 스프링 MVC는 이미 모든 것을 알고 있어야하며 빠른 목록을 가져와야합니다. 그러나 어떻게?

해결법

  1. ==============================

    1.나는 또한 몇 달 전에 그러한 요구 사항을 발견했으며 다음 코드 스 니펫을 사용하여이를 달성했다.

    나는 또한 몇 달 전에 그러한 요구 사항을 발견했으며 다음 코드 스 니펫을 사용하여이를 달성했다.

    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
            scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
            for (BeanDefinition beanDefinition : scanner.findCandidateComponents("com.xxx.yyy.controllers")){
                System.out.println(beanDefinition.getBeanClassName());
            }
    

    컨트롤러에서 이와 같은 작업을 수행 할 수도 있습니다.

    코드 스 니펫을 업데이트했습니다. 필요한 코드를 제거하고 더 나은 이해를 위해 컨트롤러의 클래스 이름을 표시합니다. 희망이 당신을 도와줍니다. 건배.

  2. ==============================

    2.@Japs가 제안한 접근법이 마음에 들지만 다른 접근법을 추천하고자합니다. 이는 클래스 경로가 Spring에 의해 이미 스캔되었고 컨트롤러와 요청 된 매핑 된 메소드가 구성되었다는 관찰에 기반을두고 있습니다.이 매핑은 handlerMapping 구성 요소에서 유지 관리됩니다. Spring 3.1을 사용하고 있다면이 handlerMapping 컴포넌트는 RequestMappingHandlerMapping의 인스턴스이다.이 클래스를 따라 handlerMappedMethods와 연관된 컨트롤러를 쿼리 할 수있다. (이전 버전의 Spring을 사용하는 경우 비슷한 메소드를 사용할 수 있어야한다. 접근):

    @Japs가 제안한 접근법이 마음에 들지만 다른 접근법을 추천하고자합니다. 이는 클래스 경로가 Spring에 의해 이미 스캔되었고 컨트롤러와 요청 된 매핑 된 메소드가 구성되었다는 관찰에 기반을두고 있습니다.이 매핑은 handlerMapping 구성 요소에서 유지 관리됩니다. Spring 3.1을 사용하고 있다면이 handlerMapping 컴포넌트는 RequestMappingHandlerMapping의 인스턴스이다.이 클래스를 따라 handlerMappedMethods와 연관된 컨트롤러를 쿼리 할 수있다. (이전 버전의 Spring을 사용하는 경우 비슷한 메소드를 사용할 수 있어야한다. 접근):

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
    
    @Controller
    public class EndpointDocController {
     private final RequestMappingHandlerMapping handlerMapping;
     
     @Autowired
     public EndpointDocController(RequestMappingHandlerMapping handlerMapping) {
      this.handlerMapping = handlerMapping;
     }
      
     @RequestMapping(value="/endpointdoc", method=RequestMethod.GET)
     public void show(Model model) {
      model.addAttribute("handlerMethods", this.handlerMapping.getHandlerMethods());
     } 
    }
    

    이 URL http://biju-allandsundry.blogspot.com/2012/03/endpoint-documentation-controller-for.html에서 자세한 내용을 제공했습니다.

    이것은 스프링 소스의 Rossen Stoyanchev에 의한 Spring 3.1 프레젠테이션을 기반으로합니다.

  3. from https://stackoverflow.com/questions/10898056/how-to-find-all-controllers-in-spring-mvc by cc-by-sa and MIT license