为了提供我想要遍历所有Spring MVC控制器的一些运行时生成的API文档。 所有控制器都注解与Spring注解@Controller。 目前,我不喜欢这样写道:
for (final Object bean: this.context.getBeansWithAnnotation(
Controller.class).values())
{
...Generate controller documentation for the bean...
}
但是这个代码的第一个电话是极其缓慢。 我不知道春天遍历所有类的类路径,而不只是检查定义的bean。 运行上面的代码时,已经加载的控制器,该日志显示他们都用自己的请求映射,所以Spring MVC中必须已经知道所有这些,必须有一个更快的方法让他们的名单。 怎么会呢?
我也碰到过这样的要求来几个月前,我已经用下面的代码片段实现它。
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());
}
你也可以做这样的事情与你的控制器。
更新的代码片段。 删除了不必要的代码,并只显示控制器的类名更好的理解。 希望这可以帮助你。 干杯。
我喜欢@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的介绍。