问题描述
在使用Spring Boot时,我们希望能够通过反射动态调用Service层中的方法,但在实践中发现,直接使用反射调用ServiceImpl中的方法时可能会导致NullPointerException异常。特别是当ServiceImpl中的依赖对象未正确注入时,这种情况更加常见。
问题分析
依赖注入机制失效:Spring Boot通常使用依赖注入来管理Service层的实例和依赖对象。然而,直接通过反射调用ServiceImpl的方法时,Spring的依赖注入机制可能会失效,导致依赖对象未能正确初始化,从而导致空指针异常。
依赖对象为null:当ServiceImpl中依赖的对象,如Mapper,未正确注入时,反射调用相关方法可能会导致依赖对象为null,进而触发空指针异常。
解决方案的选择:针对这样的问题,需要寻找方法来确保依赖注入机制的生效,以及正确地初始化ServiceImpl中的依赖对象,同时保证动态调用方法的合法性。
解决方案
创建SpringBootBeanUtil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component;
@Component public class SpringBootBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringBootBeanUtil.applicationContext == null) { SpringBootBeanUtil.applicationContext = applicationContext; } }
public static ApplicationContext getApplicationContext() { return applicationContext; }
public static Object getBean(String name) { return getApplicationContext().getBean(name); }
public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); }
public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); }
}
|
编写调用方法 executeMethod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public Object executeMethod(String classAndMethodPath, Object... args) { try { String[] split = classAndMethodPath.split("\\."); String methodName = split[split.length-1]; String className = classAndMethodPath.replace("."+methodName,"");
ApplicationContext applicationContext = SpringBootBeanUtil.getApplicationContext();
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); return method.invoke(applicationContext.getBean(ServiceImplType),args);
} catch (Exception e) { e.printStackTrace(); } return null; }
|
调用
1
| Object object = executeMethod("com.XXXXX.selectXxById","666666666");
|
总结
以上就是springboot 反射调用ServiceImpl时报错:java.lang.NullPointerExceptio、,mapper为null【解决方法】的全部内容。
版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/