[SPRING] Spring MVC에서 모든 컨트롤러를 찾는 방법은 무엇입니까?
SPRINGSpring 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.나는 또한 몇 달 전에 그러한 요구 사항을 발견했으며 다음 코드 스 니펫을 사용하여이를 달성했다.
나는 또한 몇 달 전에 그러한 요구 사항을 발견했으며 다음 코드 스 니펫을 사용하여이를 달성했다.
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.@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 프레젠테이션을 기반으로합니다.
from https://stackoverflow.com/questions/10898056/how-to-find-all-controllers-in-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring REST 서비스 : 요청에서 JSON 검색하기 (0) | 2018.12.12 |
---|---|
[SPRING] 스프링 보안 및 @Async (인증 된 사용자가 섞여 있음) (0) | 2018.12.12 |
[SPRING] BeanName에 대한 BindingResult 또는 일반 대상 객체가 요청으로 사용 가능하지 않음 attr [duplicate] (0) | 2018.12.12 |
[SPRING] javax.validation.constraints의 주석이 작동하지 않습니다. (0) | 2018.12.12 |
[SPRING] Spring은 Map bean을 autowire 할 수 없다. (0) | 2018.12.12 |