支持从springboot的war包运行时从classes以及jar包中读取类信息

本文介绍了一种通过包名扫描所有Controller接口的方法,并展示了如何获取接口、注解及其属性值等信息。支持从Spring Boot的WAR文件中查找Jar包内的类。此外,还介绍了如何查询接口的调用情况,包括调用次数、最大执行时长等。

支持按包扫描class中所有的Controller接口

功能:

支持java -jar **.war的模式,以反射形式按包名扫描所有的类(含jar包中的类),以便于获取类的:接口,注解,以及接口注解的属性值等信息

 按包名扫描class中所有的Controller接口(支持从springboot的war中再查找jar包中的类)

 同时支持扫描class中的Annotation注解及注解的属性值

/**
     * 从类中直接加载所有controller类的接口信息
     * 并可与正在运行的接口关联
     *
     * @param request   HttpServletRequest
     * @param requestVo RequestVo
     * @return ResultData
     */
    @RequestMapping(value = "/requestScans", method = {RequestMethod.POST, RequestMethod.GET})
    @CheckLogin
    public ResultData requestScans(HttpServletRequest request, RequestVo requestVo
            , @RequestParam(value = "type", required = false, defaultValue = "current") String type
            , @RequestParam(value = "day", required = false, defaultValue = "-1") Integer day) {
        String token = RequestUtils.getToken(request);
        UserVo userVo = dflUserLoginBiz.getUserByToken(token);
        checkUserPermission(userVo, UserOperType.VIEW);
        String pkg = request.getParameter("pkg");
        pkg = (String) CommUtils.nvl(pkg, "org.ccs.opendfl");
        AuditLogUtils.addAuditLog(request, userVo, "list", "ok", TIME_NULL);
        //找出Controller下的所有注解,以及频率限制、分布式锁配置参数
        List<RequestVo> list = AnnotationControllerUtils.getControllerRequests(pkg);
        List<RequestShowVo> showList = list.stream().map(RequestShowVo.class::cast).collect(Collectors.toList());

        //支持按requestUri查询接口
        if (StringUtils.isNotBlank(requestVo.getRequestUri())) {
            showList = showList.stream().filter(t -> t.getRequestUri().contains(requestVo.getRequestUri())).collect(Collectors.toList());
        }

        //显示从启动到现在各接口的调用情况(调用次数,调用时间超过1秒的最大时长,超限次数)
        requestRunCount(type, day, showList);
        return ResultData.success(showList);
    }

功能查询效果如下

 

 支持查近期的数据

每天以redis的zset存一份对每个有调用的接口调用次数,执行最大时长的记录 
系统用本地缓存记录调用次数,通过异步单线程每10秒同步一次到redis的zset

 

 核心代码

见:opendfl项目中的以下代码:
org.ccs.opendfl.core.utils.AnnotationControllerUtils.java
org.ccs.opendfl.core.utils.AnnotationClassUtils.java
 

SpringBoot项目中,正确地访问jarwar中的资源文件,尤其是在Linux服务器部署环境下,是一个需要特别注意的问题。首先,需要理解的是,当使用`getResource()`方法获取资源,它返回的是一个URL对象,该对象含了资源在文件系统中的绝对路径。这个方法适用于开发环境,因为在开发环境中,资源文件是直接放在文件系统中的。 参考资源链接:[SpringBoot部署:处理warjar资源访问问题](https://wenku.youkuaiyun.com/doc/6412b4abbe7fbd1778d40647?spm=1055.2569.3001.10343) 然而,在Linux服务器上部署,如果使用`getResource()`方法尝试获取资源的路径,可能会得到似`/data/zeus/service-hi-1.0.0-SNAPSHOT.war!/WEB-INF/classes!/1.xml`这样的路径,这表明资源实际上还在未解压的war内,因此无法直接通过文件路径访问。这是因为服务器环境下的文件访问权限与本地环境不同。 为了解决这个问题,应该使用`getResourceAsStream()`方法来代替`getResource()`方法。这个方法不返回资源的路径,而是返回一个`InputStream`对象,允许我们从输入流中读取资源,而无需关心资源的物理位置。这样即使资源文件被含在打后的jarwar中,也能够被正确读取和处理。示例代码如下: ```java public class TestMain { public static void main(String[] args) { try (InputStream inputStream = TestMain.class.getClassLoader().getResourceAsStream( 参考资源链接:[SpringBoot部署:处理warjar资源访问问题](https://wenku.youkuaiyun.com/doc/6412b4abbe7fbd1778d40647?spm=1055.2569.3001.10343)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值