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~~

相关推荐
编程修仙6 分钟前
第一篇 认识SpringBoot
java·spring boot
qwepoilkjasd7 分钟前
std::string详解
后端
bcbnb8 分钟前
iOS 应用上架流程的工程化拆解 从签名体系到提交审核的全过程管控
后端
数新网络9 分钟前
Compaction in Apache Iceberg
后端
骇客野人10 分钟前
.gitignore文件常用设置
java
神奇的程序员12 分钟前
实现一个内网服务监测告警系统
后端·自动化运维
马卡巴卡13 分钟前
Spring监听器(ApplicationEvent):比MQ更轻的异步神器!
后端
QZQ5418815 分钟前
go中单例模式以及使用反射破坏单例的方法
后端
bill44718 分钟前
BPMN2.0,flowable工作流,【用户任务】使用【任务监听器】动态设置下一步处理人
java·工作流引擎·flowable·bpmn
Cricyta Sevina18 分钟前
Java 语言多线程核心概念全解析
java·开发语言