当前位置: 首页 > 面试题库 >

反射性地获取与特定URL匹配的Spring MVC控制器列表

潘飞英
2023-03-14
问题内容

如何以反射方式获取所有控制器的列表(最好是不仅是带注释的,而且还要在xml中指定),并与Spring MVC应用程序中的某些特定网址匹配?

在仅带注释的情况下,

@Autowired
private ListableBeanFactory listableBeanFactory;
...
whatever() {
    Map<String,Object> beans = listableBeanFactory.getBeansWithAnnotation(RequestMapping.class);

    // iterate beans and compare RequestMapping.value() annotation parameters
    // to produce list of matching controllers
}

可以使用,但是在一般情况下,如果可以在spring.xml配置中指定控制器,该怎么办?以及如何处理请求路径参数?


问题答案:

从Spring
3.1开始,存在类RequestMappingHandlerMapping,它提供有关RequestMappingInfo@Controller类的映射()的信息。

@Autowired
private RequestMappingHandlerMapping requestMappingHandlerMapping;

@PostConstruct
public void init() {
    Map<RequestMappingInfo, HandlerMethod> handlerMethods =
                              this.requestMappingHandlerMapping.getHandlerMethods();

    for(Entry<RequestMappingInfo, HandlerMethod> item : handlerMethods.entrySet()) {
        RequestMappingInfo mapping = item.getKey();
        HandlerMethod method = item.getValue();

        for (String urlPattern : mapping.getPatternsCondition().getPatterns()) {
            System.out.println(
                 method.getBeanType().getName() + "#" + method.getMethod().getName() +
                 " <-- " + urlPattern);

            if (urlPattern.equals("some specific url")) {
               //add to list of matching METHODS
            }
        }
    }       
}

在定义控制器的spring上下文中定义此bean非常重要。



 类似资料:
  • 给定一个列为“BoolCol”的数据帧,我们想要查找数据帧的索引,其中“BoolCol”的值 == True 我目前有一种迭代的方法来完成它,它非常有效: 但这不是熊猫的正确方法。经过一些研究,我目前正在使用以下代码: 这个给了我一个索引列表,但是它们不匹配,当我通过执行以下操作来检查它们时: 结果其实是假的!! 熊猫的正确做法是什么?

  • 控制器 控制器名称空间前缀统一为 “{$APPLICATION_DIR}Controller,即系统默认应用目录为App,那幺所有的控制器均应在/App/Controller目录下。 所有的控制器都应继承CoreAbstraceInterfaceAbstractController。 关于AbstractController中的抽象方法 easyswoole中,任何控制器都需继承AbstractC

  • easySwoole支持REST风格开发。在实现上,其实是对AbstractController进行了REST规则封装,本质上,也是一个控制器。 支持GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。 实例代码 namespace AppControllerRest; use CoreAbstractInterfaceAbstractREST; use CoreHttp

  • http://some-amazon-link:8080/the-war-name/login 现在我正在纠结如何在Spring MVC项目中添加“/the-war-name/”以及在哪里添加“/the-war-name/”。 它在 null

  • 我用这个过滤聊天中的消息,我用C#来做这件事。这里有一个工具,如果你想进一步挖掘:http://regexr.com/3faji C#扩展方法:

  • 自定义路由 easySwoole支持路由拦截。其路由利用fastRoute实现,因此其路由规则与其保持一致,该组件的详细文档请参考 GitHub文档 路由定义 若需要再easySwoole使用路由拦截功能,请在应用目录(默认为App)下,建立Router类,井继承Core\AbstractInterface\AbstractRouter实现addRouter方法,如果在类UNIX系统下请严格注意文

  • 我在控制器中使用ASP.NET MVC5属性路由操作。 /ControllerName/ActionName 如何使/ControllerName/ActionName处于操作状态?

  • 本文向大家介绍Python Pandas 获取列匹配特定值的行的索引问题,包括了Python Pandas 获取列匹配特定值的行的索引问题的使用技巧和注意事项,需要的朋友参考一下 给定一个带有列"BoolCol"的DataFrame,如何找到满足条件"BoolCol" == True的DataFrame的索引 目前有迭代的方式来做到这一点: 这虽然可行,但不是标准的 Pandas 方式。经过一番研