用于获取spring所有支持的请求url,也就是{@link RequestMapping}的url

反正从网上没搜索出来,只好自己来。

用于获取spring所有支持的请求,也就是{@link RequestMapping}的url

想测试一下服务器是否所有接口均正确无误,需要对所有的接口都请求一次,但是无奈接口太多,一个个写是不可能的。文档虽然都有,但是也很分散。

寻找过程:
1. 启动服务器,观察日志,日志开启debug模式,可以看到。

[03-17 16:02:05,959] DEBUG [tartStop-1][] o.s.w.s.m.m.a.RequestMappingHandlerMapping[100] - Looking for request mappings in application context: Root WebApplicationContext: startup date [Thu Mar 17 16:02:03 CST 2016]; root of context hierarchy
[03-17 16:02:05,975] INFO  [tartStop-1][] o.s.w.s.m.m.a.RequestMappingHandlerMapping[181] - Mapped 这里是接口信息。必需隐去
[03-17 16:02:05,976] INFO  [tartStop-1][] o.s.w.s.m.m.a.RequestMappingHandlerMapping[181] - Mapped 这里是接口信息。必需隐去
[03-17 16:02:05,976] INFO  [tartStop-1][] o.s.w.s.m.m.a.RequestMappingHandlerMapping[181] - Mapped 这里是接口信息。必需隐去
[
  1. 那么在此类RequestMappingHandlerMapping中寻找该日志输出,包括寻找其父类。即可在类AbstractHandlerMethodMapping看到源码。
    protected void initHandlerMethods() {
        if (logger.isDebugEnabled()) {
            logger.debug("Looking for request mappings in application context: " + getApplicationContext());
        }

        String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ?
                BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
                getApplicationContext().getBeanNamesForType(Object.class));

        for (String beanName : beanNames) {
            if (isHandler(getApplicationContext().getType(beanName))){
                detectHandlerMethods(beanName);//在这里
            }
        }
        handlerMethodsInitialized(getHandlerMethods());
    }

其中detectHandlerMethods(beanName);会调用registerHandlerMethod(handler, method, mapping);,registerHandlerMethod 函数是关键。

    protected void registerHandlerMethod(Object handler, Method method, T mapping) {
        HandlerMethod newHandlerMethod = createHandlerMethod(handler, method);
        HandlerMethod oldHandlerMethod = handlerMethods.get(mapping);
        if (oldHandlerMethod != null && !oldHandlerMethod.equals(newHandlerMethod)) {
            throw new IllegalStateException("Ambiguous mapping found. Cannot map '" + newHandlerMethod.getBean()
                    + "' bean method \n" + newHandlerMethod + "\nto " + mapping + ": There is already '"
                    + oldHandlerMethod.getBean() + "' bean method\n" + oldHandlerMethod + " mapped.");
        }

        this.handlerMethods.put(mapping, newHandlerMethod);//这就是存储的变量,url映射到处理函数
        if (logger.isInfoEnabled()) {
            logger.info("Mapped \"" + mapping + "\" onto " + newHandlerMethod);
        }

        Set<String> patterns = getMappingPathPatterns(mapping);
        for (String pattern : patterns) {
            if (!getPathMatcher().isPattern(pattern)) {
                this.urlMap.add(pattern, mapping);//这就是存储的变量,url字符串到urlMapping对象的
            }
        }
    }

可以看到,它就存储在handlerMethods变量中,而且这个变量提供了get方法,所以,spring是提供了获取所有url的接口的。但是urlMap对象没有get函数,需要通过反射去获取。
3. 那么直接获取就可以了。
我们创建一个接口用于返回所有的接口信息。记得加上过滤器进行验证权限,或者只能在本机使用,避免被其他人获取到。

    /**
     * 用于获取spring所有支持的请求,也就是{@link RequestMapping}的url
     *
     * @return
     */
    @RequestMapping("getAllService")
    public Result getAllService() {
        RequestMappingHandlerMapping requestMappingHandlerMapping = SpringIocUtil.getBean(RequestMappingHandlerMapping.class);
//        Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();
        try {
            Field field = AbstractHandlerMethodMapping.class.getDeclaredField("urlMap");
            MultiValueMap<String, RequestMappingInfo> urlMap = (MultiValueMap<String, RequestMappingInfo>) field.get(requestMappingHandlerMapping);
            return ResultUtils.result(urlMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultUtils.result(null);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的示例代码,演示了如何使用 jQuery Select2 进行 AJAX 请求获取 Spring Boot 后端的数据: 前端代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Select2 Example</title> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/select2.min.js"></script> <script> $(document).ready(function() { $('#mySelect').select2({ ajax: { url: '/api/getData', dataType: 'json', delay: 250, processResults: function (data) { return { results: data }; }, cache: true }, minimumInputLength: 3 }); }); </script> </head> <body> <select id="mySelect" style="width: 300px;"></select> </body> </html> ``` 后端代码: ```java @RestController @RequestMapping("/api") public class MyController { @GetMapping("/getData") public List<MyData> getData(@RequestParam("q") String query) { // 根据查询条件从数据库中获取数据 List<MyData> dataList = myService.getData(query); return dataList; } } ``` 在上面的代码中,我们在前端使用了 Select2 插件,并配置了 AJAX 请求,指向后端的 `/api/getData` 接口。在后端,我们定义了一个 `MyController` 类,其中的 `getData` 方法会根据传入的 `q` 参数从数据库中获取数据并返回。 需要注意的是,我们在前端配置了 `minimumInputLength` 参数,它表示用户至少需要输入多少个字符才会触发 AJAX 请求。在这个例子中,我们设定为 3。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值