如何获取所有控制器的所有请求映射?

时间:2016-10-07 12:11:47

标签: spring spring-mvc spring-4

我创建了许多controllers,每个package com.ambre.hib.controller; @Controller @RequestMapping("/") public class HomeController { ... } package com.ambre.hib.controller; @Controller @RequestMapping("/ajax") public class AjaxController { ... } 都指定了其请求映射,以便在应用中识别它们:

enter image description here

request({
url:'http://custom-url',
method:'GET'},function(err,response,body){

console.log("Got Response : "+respnose.statusCode);
console.log("Body : "+body);
console.log("name is "+body.name);

})


My output is :
Got Response : 200
Body :{"name":"John","id":"139321"}
name is undefined

那么如何以编程方式获取项目中所有控制器的请求映射的所有值?我希望得到类似于包含例如" /"的列表。 ," / ajax"。

1 个答案:

答案 0 :(得分:0)

您可以使用 Google Guava Java Reflection API 来实现这一目标。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>19.0</version>
</dependency>

Google Guava包含一个类ClassPath,其中包含三种扫描顶级类的方法,您可以使用getTopLevelClasses(String packageName)

参考此示例代码。

public void getClassOfPackage(String packagenom) {

    final ClassLoader loader = Thread.currentThread()
            .getContextClassLoader();
    try {

        ClassPath classpath = ClassPath.from(loader); // scans the class path used by classloader
        for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses(packagenom)) {
         if(!classInfo.getSimpleName().endsWith("_")){
            System.out.println(classInfo.getSimpleName());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

下面的代码会打印来自单个控制器的所有@RequestMapping,您可以更新此代码。

 Class clazz = Class.forName("com.abc.cbe.rest.controller.MyController"); // or list of controllers, //you can iterate that list
    for(Method method :clazz.getMethods()){
         for(Annotation annotation :method.getDeclaredAnnotations()){
             if(annotation.toString().contains("RequestMapping"))
            System.out.println("Annotation is..."+ annotation.toString());
     }
     }