spring-webmvc根据请求路径找到对应的 HandlerMethod

代码中有的时候想通过请求地址获得对应的controller处理方法(此时HttpServletRequest对象还没有生成),可以使用以下方法(以spring-webmvc6.1.2版本为示例)

复制代码
    @Resource
    private RequestMappingHandlerMapping handlerMapping;

    /**
     * 根据请求地址找到对应的 HandlerMethod
     *
     * @param requestURI 请求地址
     * @return HandlerMethod
     */
    private HandlerMethod getHandlerMethodByRequestURI(String requestURI) throws Exception {
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = handlerMapping.getHandlerMethods();

        Object mappingRegistry = ObjectUtil.getValue(handlerMapping, "mappingRegistry");
        if (Objects.equals(mappingRegistry.getClass().getName(), "org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry")) {
            Field pathLookup = mappingRegistry.getClass().getDeclaredField("pathLookup");
            pathLookup.setAccessible(true);
            Object o = pathLookup.get(mappingRegistry);
            System.out.println(o);
            if (o instanceof Map map) {
                Object o1 = map.get(requestURI);
                if (o1 instanceof List list && CollectionUtil.isNotEmpty(list)) {
                    HandlerMethod handlerMethod = handlerMethods.get(list.get(0));
                    
                    System.out.println(handlerMethod);
                    return handlerMethod; 
                }
            }
        }
        return null;
    }

拿到HandlerMethod 进而可以获得对应的反射Method,进而获取到方法上的注解,可以做很多事情了

over~~

相关推荐
法拉第第1 分钟前
CAS乐观锁
后端
Samson Bruce1 分钟前
【docker swarm】
java·docker·eureka
高松燈2 分钟前
K8s学习文档(1) -- 集群搭建(手把手教学)
后端
czlczl200209253 分钟前
SpringBoot自定义Redis
spring boot·redis·后端
踏浪无痕3 分钟前
Java 17 升级避坑:如何安全处理反射访问限制
后端·面试·架构
Go高并发架构_王工5 分钟前
Redis命令执行原理与源码分析:深入理解内部机制
数据库·redis·后端
代码笔耕7 分钟前
面向对象开发实践之消息中心设计(四)--- 面向变化的定力
java·设计模式·架构
唐叔在学习7 分钟前
buildozer打包详解:细说那些我踩过的坑
android·后端·python
okseekw7 分钟前
Java动态代理实战:手把手教你实现明星经纪人模式
java·后端
Wang15308 分钟前
c++与Java谁的性能更胜一筹
java·c++