RequestMappingHandlerMapping获取项目中的全部接口信息

本文详细介绍了如何利用Spring框架中的RequestMappingHandlerMapping类获取项目中所有Controller的接口信息,包括URL、方法、返回类型等,并展示了实际操作的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

本文主要讲述spring如何获取项目中所有controller的接口信息。主要是依赖于RequestMappingHandlerMapping类。

可先了解RequestMappingHandlerMapping的属性和内容。

spring执行流程

在这里插入图片描述

代码

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.condition.*;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

/**
 * 获取项目中的全部接口地址
 */
@Controller
@RequestMapping("/appRest")
public class APIRestService {

    @ResponseBody
    @RequestMapping("projectApi")
    public String index() throws IOException {
        WebApplicationContext wac = (WebApplicationContext) ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE);
        Map<String, HandlerMapping> requestMappings = BeanFactoryUtils.beansOfTypeIncludingAncestors(wac, HandlerMapping.class, true, false);
        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
        StringBuffer sb = new StringBuffer();
        for (HandlerMapping handlerMapping : requestMappings.values()) {
            if (handlerMapping instanceof RequestMappingHandlerMapping) {
                RequestMappingHandlerMapping rmhm = (RequestMappingHandlerMapping) handlerMapping;
                Map<RequestMappingInfo, HandlerMethod> handlerMethods = rmhm.getHandlerMethods();
                for (RequestMappingInfo rmi : handlerMethods.keySet()) {
                    PatternsRequestCondition prc = rmi.getPatternsCondition();
                    RequestMethodsRequestCondition methodsCondition = rmi.getMethodsCondition();
                    Set<String> patterns = prc.getPatterns();
                    List<RequestMethod> methods = methodsCondition.getMethods().stream().toList();
                    String s = methods.size()>0 ? methods.get(0).toString() : "RequestMapping";
                    HandlerMethod hm = handlerMethods.get(rmi);
                    String beanTypeName = hm.getBeanType().getName();
                    sb.append(beanTypeName).append("\t").append(s).append("\t");
                    for (String url : patterns) {
                        if (url.equals("/app/projectApi")) {
                            continue;
                        }
                        Class<?> clazz = hm.getBeanType();
                        Method method = hm.getMethod();
                        //获取到该方法的参数们
                        String[] params = u.getParameterNames(method);
                        String clazzStr = clazz.getName();
                        String methodAll = method.toString();
                        String methodWithParam = methodAll.substring(methodAll.indexOf(clazzStr) + clazzStr.length() + 1);
                        String methodSimpleName = methodWithParam.substring(0, methodWithParam.indexOf("("));
                        String methodParamsClazz = methodWithParam.substring(methodWithParam.indexOf("(") + 1, methodWithParam.indexOf(")")).replace(")", "");
                        // 判断返回数据
                        boolean isPage = method.getReturnType().equals(String.class) || method.getReturnType().equals(ModelAndView.class);
                        boolean isJosn = method.isAnnotationPresent(ResponseBody.class);
                        boolean isController = (!hm.getBeanType().isAnnotationPresent(RestController.class) && hm.getBeanType().isAnnotationPresent(Controller.class));
                        String line = (isPage && !isJosn && isController ? "页面" : "数据") + "\t" + url + "\t" + clazzStr + "\t" + method.getReturnType().getName() + "\t" + methodSimpleName + "\t";

                        if (params.length > 0) {
                            String[] split = methodParamsClazz.split(",");
                            for (int i = 0; i < params.length; i++) {
                                line += split[i] + " " + params[i] + ",";
                            }
                            line = line.substring(0, line.length() - 1);
                        }
                        line += "\r\n";
                        sb.append(line);
                    }
                }
            }
        }
        FileUtils.writeStringToFile(new File("e:/output/projectdoc"), sb.toString());
        return sb.toString();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值