代码中有的时候想通过请求地址获得对应的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~~