解决被反射的类无法被spring管理,空指针异常问题

目录

问题

原因

解决方案


问题

这是我在开发语音指令识别功能时遇到的问题,在将语音转成文字后需要进行指令匹配,指令匹配成功,就会获得对应的处理方法名称以及所属类,然后通过反射机制去执行该方法完成指令对应的操作

部分代码如下:

@Component
public class MethodSet {private final Map<String, Class<?>> methodMap = new HashMap<>();public Map<String, Class<?>> getMethodMap() {methodMap.put("countOrder", OrderCommand.class);methodMap.put("takeOrder",OrderCommand.class);//。。。。其他命令与对应的类return methodMap;}}
                log.info("method key:{}",reply);Class<?> aClass = methodSet.getMethodMap().get(reply);Method method = aClass.getMethod(reply);Object result = method.invoke(aClass.getDeclaredConstructor().newInstance());              reply = (String) result;

在获取到需要通过反射执行的方法,以及方法所属类之后就能进行调用指令方法了,但是我的指令类内部依赖了相关Service类(被spring容器管理)代码如下:

@Component
public class OrderCommand{@Autowiredprivate StoreOrderService storeOrderService;public String countOrder(){System.out.println("订单统计方法执行");Map<String, Integer> orderNumbers = storeOrderService.getOrderNumbers();//其他逻辑。。。。。};//。。。。。。。}

此时就抛出了空指针异常,提示我storeOrderService.getOrderNumbers()方法并不存在,也就是依赖并没有注入成功。

原因

在我搜寻资料后也是找到了原因,就是被反射的类无法被spring管理

参考博客文章:@Autowired被反射调用时,空指针错误_mock@autowired对象空指针-CSDN博客

解决方案

手动去完成@Autowired效果,交给spring容器管理。

步骤:

通过spring上下文ApplicationContext的getBean(Class<T>)方法按照类型获取bean实例

通过ApplicationContext的getAutowireCapableBeanFactory()方法获取到AutowireCapableBeanFactory对象使用它的autowireBean(obj)方法来手动处理Bean的自动装配

修改后反射调用代码如下:

                    Class<?> aClass = methodSet.getMethodMap().get(reply);Object obj = applicationContext.getBean(aClass);applicationContext.getAutowireCapableBeanFactory().autowireBean(obj);Method method = obj.getClass().getMethod(reply);Object result = method.invoke(obj);reply = (String) result;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++——string

一学习string的原因 1.从个人理解角度上&#xff1a; 在刚开始学习之前&#xff0c;我只知道学习完string在以后的刷题中能提高做题效率&#xff0c;在对字符串的处理string库中也许有对应的接口去实现需求&#xff0c;不用自己去写函数的实现。 但在学string中改变了之前的…

谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介

谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介 IC (Integrated Circuit) 集成电路 (Integrated Circuit, IC) 是一种把电路中的元器件如电阻、电容、晶体管等集成在一块半导体材料上的微型电子器件。它是现代电子系统的基础组件&#xff0c;按照功能可分为模…

【PyTorch】基础学习:一文详细介绍 torch.save() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.save() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints&#xff1a;模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)

简介 为什么叫最后的挣扎, 其实都知道即将到来的 HarmonyOS NEXT 将抛弃Android支持&#xff0c;纯血HarmonyOS 将上线&#xff0c; 此时再说Qt for android支持Huawei HarmonyOS的设备其实并没有多少意思&#xff0c; 但恐怕在大多数基础软件完成兼容前&#xff0c; 很多人还是…

Linux系统中的网络协议和协议栈

在当今数字化世界中&#xff0c;网络已经成为了连接人与人、人与机器、机器与机器的重要桥梁。Linux操作系统在网络领域扮演着重要角色&#xff0c;其网络协议和协议栈是支撑其网络功能的基础。本文将深入探讨Linux系统中的网络协议和协议栈&#xff0c;包括其组成、功能以及如…

k8s的master节点主要模块说明

背景 k8s是一个master-worker模式的集群&#xff0c;master节点的作用主要是用于管理&#xff0c;worker节点的作用是用于运行docker 容器&#xff0c;master节点中有三个重要的模块组件&#xff0c;本文就来简单看下master的这三个模块组件的功能 master节点主要模块 1 API…

机器视觉学习(五)—— 图像的几何

一、图像的几何变化 图像的几何变化指的是通过改变图像的位置、尺寸和方向等参数来实现的图像变换。常见的图像几何变化包括平移、旋转、缩放和翻转等。 平移&#xff1a;将图像在平面上按照指定的平移距离水平或垂直移动。 旋转&#xff1a;按照指定的角度将图像绕中心或其他…

【PyTorch】基础学习:一文详细介绍 torch.load() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.load() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…

LeetCode 189.轮转数组

题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 思路&#xff1a; 代码&#xff1a; class Solution {public void rotate(int[] nums, int k) {int n nums.length;k k % n;reverse(nums, 0, n);revers…

sqlite 常见命令 表结构

在 SQLite 中&#xff0c;将表结构保存为 SQL 具有一定的便捷性和重要性&#xff0c;原因如下 便捷性&#xff1a; 备份和恢复&#xff1a;将表结构保存为 SQL 可以方便地进行备份。如果需要还原或迁移数据库&#xff0c;只需执行保存的 SQL 脚本&#xff0c;就可以重新创建表…

vulhub中GitLab 任意文件读取漏洞复现(CVE-2016-9086)

GitLab是一款Ruby开发的Git项目管理平台。在8.9版本后添加的“导出、导入项目”功能&#xff0c;因为没有处理好压缩包中的软连接&#xff0c;已登录用户可以利用这个功能读取服务器上的任意文件。 环境运行后&#xff0c;访问http://your-ip:8080即可查看GitLab主页&#xff0…

服务器上很多time_wait是什么意思

在服务器上出现大量的 TIME_WAIT 状态的连接通常是正常的现象&#xff0c;但如果数量过多可能会导致资源浪费和性能问题。TIME_WAIT 状态是指连接已经被关闭&#xff0c;但是套接字还在等待一段时间以确保对方收到了连接关闭的确认消息。以下是关于 TIME_WAIT 状态的解释&#…

设计原则、工厂、单例模式

什么是设计模式 简单来说&#xff0c;设计模式就是很多程序员经过相当长的一段时间的代码实践、踩坑所总结出来的一套解决方案&#xff0c;这个解决方案能让我们少写一些屎山代码&#xff0c;能让我们写出来的代码写出来更加优雅&#xff0c;更加可靠。所以设计模式的好处是显而…

Docker Compose 基本语法

services 是顶级节点&#xff0c;也就是你要启动的服务全部放在这里。 MySOL就是我们预期中的一个服务。 mysql8:指的是我们这个服务叫 mysql8. image:我们这个服务里运行的是什么镜像&#xff0c;或者说跑的是什么。这里指定了使用 mysql:8.0.29 这个版本。 command:启动命令&…

Linux进程管理:(六)SMP负载均衡

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识 1.1 CPU管理位图 内核…

深度强化学习01

Random variable Probability Density Function 期望 Random Sampling 学习视频 这绝对是我看过最好的深度强化学习&#xff01;从入门到实战&#xff0c;7小时内干货不断&#xff01;_哔哩哔哩_bilibili

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;智慧城市作为现代城市发展的新模式&#xff0c;正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为城市的规划、管理、服务等方面带来了革命性的变革。本文…

Mybatis-xml映射文件与动态SQL

xml映射文件 动态SQL <where><if test"name!null">name like concat(%,#{name},%)</if><if test"username!null">and username#{username}</if></where> <!-- collection&#xff1a;遍历的集合--> <!-- …