【问题标题】:How to get all the requestmapping of all controllers?如何获取所有控制器的所有请求映射?
【发布时间】:2016-10-07 21:16:12
【问题描述】:

我创建了许多controllers,并指定了它们的请求映射,以便在应用程序中识别它们:

package com.ambre.hib.controller;

@Controller
@RequestMapping("/")
public class HomeController {

    ...

}

package com.ambre.hib.controller;

@Controller
@RequestMapping("/ajax")
public class AjaxController {

    ...

}

那么如何以编程方式获取项目中所有控制器的请求映射的所有值?我想得到一个类似列表的东西,例如 "/" , "/ajax"。

【问题讨论】:

    标签: spring spring-mvc spring-4


    【解决方案1】:

    您可以使用 Google GuavaJava 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());
         }
         }
    

    【讨论】:

    • getClassOfPackage 方法不起作用:控制台没有输出!我已经在 pom.xml 中添加了依赖并更新了项目。
    • 我在分享之前测试了那个代码,你调试了吗?
    • 我应该调试哪些行?
    • 哈哈哈,我不是那种人;-)
    • 您关于Class.forName 的最后一个代码没有给出控制器的结果,它只输出控制器内部的操作!
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多