springboot 反射调用ServiceImpl时报错:java.lang.NullPointerExceptio、,mapper为null【解决方法】

springboot 反射调用ServiceImpl时报错:java.lang.NullPointerException、mapper为null【解决方法】

  • 问题描述
  • 问题分析
  • 解决方案
    • 创建SpringBootBeanUtil
    • 编写调用方法 executeMethod
    • 调用
  • 总结

问题描述

在使用Spring Boot时,我们希望能够通过反射动态调用Service层中的方法,但在实践中发现,直接使用反射调用ServiceImpl中的方法时可能会导致NullPointerException异常。特别是当ServiceImpl中的依赖对象未正确注入时,这种情况更加常见。

问题分析

依赖注入机制失效:Spring Boot通常使用依赖注入来管理Service层的实例和依赖对象。然而,直接通过反射调用ServiceImpl的方法时,Spring的依赖注入机制可能会失效,导致依赖对象未能正确初始化,从而导致空指针异常。

依赖对象为null:当ServiceImpl中依赖的对象,如Mapper,未正确注入时,反射调用相关方法可能会导致依赖对象为null,进而触发空指针异常。

解决方案的选择:针对这样的问题,需要寻找方法来确保依赖注入机制的生效,以及正确地初始化ServiceImpl中的依赖对象,同时保证动态调用方法的合法性。

解决方案

创建SpringBootBeanUtil

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


/**
 * Keafmd
 *
 * @ClassName: SpringBootBeanUtil
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2024/4/7
 */
@Component
public class SpringBootBeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringBootBeanUtil.applicationContext == null) {
            SpringBootBeanUtil.applicationContext = applicationContext;
        }
    }

    /**
     * 获取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     * @param clazz
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}

编写调用方法 executeMethod

public Object executeMethod(String classAndMethodPath, Object... args) {
   try {
       // classAndMethodPath = "com.example.demo.Test.test"
       // 分割字符串,获取类名和方法名
       String[] split = classAndMethodPath.split("\\.");
       String methodName = split[split.length-1];
       String className = classAndMethodPath.replace("."+methodName,"");

       ApplicationContext applicationContext = SpringBootBeanUtil.getApplicationContext();

       //反射创建serviceimpi实体对象,和实体类
       Class<?> ServiceImplType = Class.forName(className);
       //反射设置方法参数。
       Class<?>[] parameterTypes = new Class[args.length];
       for (int i = 0; i < args.length; i++) {
           parameterTypes[i] = args[i].getClass(); 
       }
       Method method = ServiceImplType.getDeclaredMethod(methodName,parameterTypes);
       //在ApplicationContext中根据class取出已实例化的bean
       return method.invoke(applicationContext.getBean(ServiceImplType),args);

   } catch (Exception e) {
       // 处理异常
       e.printStackTrace();
   }
   return null;
}

调用

Object object = executeMethod("com.XXXXX.selectXxById","666666666");      

总结

以上就是springboot 反射调用ServiceImpl时报错:java.lang.NullPointerExceptio、,mapper为null【解决方法】的全部内容。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]


加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   合作 交流  ↓   ↓   ↓  

版权声明:本文为博主作者:牛哄哄的柯南原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_43883917/article/details/137465318

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐