SpringAOP 私有方法 private 导致注入失败导致Service 空指针 null 的问题

https://blog.csdn.net/jy00733505/article/details/107524688
在工程中

/**
     * 判断此角色是否已经分配给用户
     * @param id
     * @return
     */
    @GetMapping("/existsUserByRoleId")
    @ResponseBody
    private R existsUserByRoleId(String id) {
        try {
            Map<String, Object> map = new HashMap<>();
            boolean exists = roleService.existsUserByRoleId(id);
            map.put("exists",exists);
            return R.ok(map);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error(e.getMessage());
        }
    }

测试用例roleService是有实例的,而在

/**
     * 判断此机构下是否已经分配了用户或角色
     * @param id
     * @return
     */
    @GetMapping("/existsUserOrRoleByOrgId")
    @ResponseBody
    private R existsUserOrRoleByOrgId(String id) {
        try {
            boolean exists = managementService.existsUserOrRoleByOrgId(id);
            Map<String, Object> map = new HashMap<>();
            map.put("exists",exists);
            return R.ok(map);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error(e.getMessage());
        }
    }

之中,managementService则成为了null,没有加载。
通过分析后发现,roleService为直接的普通类,并不需要实现,所以方法声明为private是可以的,而在managementService中,managementService是接口,其实现类为ManagementServiceImpl,在接口声明中使用private会导致:
因为 springboot 的缓存机制是通过切面编程 aop来实现的,对于SpringAOP的cglib是不会拦截private方法的(而JDK动态代理是基于接口的更不可能对private方法生效),因此不进切面逻辑,aop是拦截不到的。
由此导致managementService注入失败为null,当把接口声明改为public问题便解决了。

public R existsUserOrRoleByOrgId(String id) {
posted @   Ideaway  阅读(1618)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示