如何找到Spring MVC中的所有控制器?如何找到Spring MVC中的所有控制器?(How t

2019-05-17 08:15发布

为了提供我想要遍历所有Spring MVC控制器的一些运行时生成的API文档。 所有控制器都注解与Spring注解@Controller。 目前,我不喜欢这样写道:

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

但是这个代码的第一个电话是极其缓慢。 我不知道春天遍历所有类的类路径,而不只是检查定义的bean。 运行上面的代码时,已经加载的控制器,该日志显示他们都用自己的请求映射,所以Spring MVC中必须已经知道所有这些,必须有一个更快的方法让他们的名单。 怎么会呢?

Answer 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());
        }

你也可以做这样的事情与你的控制器。

更新的代码片段。 删除了不必要的代码,并只显示控制器的类名更好的理解。 希望这可以帮助你。 干杯。



Answer 2:

我喜欢@Japs建议的方法,但也想推荐了另一种途径。 这是基于你的观察,即类路径已经由Spring扫描,控制器和配置的请求映射方法,该映射被保持在handlerMapping组件。 如果您在使用Spring 3.1 handlerMapping成分是RequestMappingHandlerMapping,您可以查询到找到handlerMappedMethods和相关的控制器,沿着这些线路(如果您使用的是旧版本的春天,你应该能够使用类似的实例方法):

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());
 } 
}

我在这个网址上提供更多细节http://biju-allandsundry.blogspot.com/2012/03/endpoint-documentation-controller-for.html

这是基于由春源的罗森Stoyanchev春3.1的介绍。



文章来源: How to find all controllers in Spring MVC?