SpringBoot 多模块项目(module)Service自动注入(@Autowired)空指针错误解决

版权声明:转发请标明出处,谢谢! https://blog.csdn.net/Myuhua/article/details/84317582

 报错信息,这个我是截了上一部分,为了省空间下部分我就用...代替了。

java.lang.NullPointerException
	at com.jd.impl.UploadServiceImpl.uploadBlock(UploadServiceImpl.java:39)
	at com.jd.test.TestController.testFileUploadMethod(TestController.java:71)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at ...

小编第一次使用springboot搭建项目就报了这么个错误着实在让人有点小无奈,在搭建过程中我总结了我目前遇到得两种情况:

第一种,启动类未对包配置注解扫描,原因可能是因为搭建springboot单项目模块的时候不需要单独配置包注解扫描而忽略了这个问题。(括弧,敲黑板,你要注意你注入的组件比如Service 及 ServiceImpl均需在com(com.example)包下!我这儿把启动类又往外移了一层所以我用的com,建议大家采用com.example的建包形式,将启动类放入com.example.a下面的a包下,组件扫描的时候扫com.example(如:com.jd)包)。

//第一种问题解决方法:配置扫描注解
@SpringBootApplication(scanBasePackages = "com")
//@SpringBootApplication
//@ComponentScan(basePackages = "com")
public class SpringBootStart {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootStart.class,args);
    }
}

注意:下面第一句与下面得两句相等,你想怎么用看你自己的爱好。
@SpringBootApplication(scanBasePackages = "com")
//@SpringBootApplication
//@ComponentScan(basePackages = "com")

第二种:这一种就有点kd了,不仔细看还真看不出来,我在起初代码测试的时候用的new实例的方法去做的,而在后来用springboot去管理的时候我忘记了注释掉,总结一句就是,第二种错误的原因是因为出现了new实例与框架自动注入管理同时出现的情况,new出来后的实例与springboot管理后注入进来的实例不是同一个(一个被初始化了,一个未被初始化),导致,报了空指针的错误。以后记得只要是用自动注入就别再自己new同样的实例了。

    @Test
    public void testFileUploadMethod() throws IOException {
        String fileSrc = "D:\\tempfile\\elasticsearch-6.4.2.zip";
        byte[] bytes1 = fileToByteArrayService.fileToBytes(fileSrc);
        int subSize = 1000000 * 25;
        Object[] objects = splitFlieService.splitAry(bytes1, subSize);
        byte[] bytes = null;
        //分片文件开始上传
        long start = System.currentTimeMillis();
//        UploadServiceImpl uploadService = new UploadServiceImpl();
        for (int i = 0; i < objects.length; i++) {
            bytes = (byte[]) objects[i];
            UploadBlockInputVo param = new UploadBlockInputVo();
            param.setFileName("elasticsearch-6.4.2");
            param.setOffset(0);
            try {
                uploadService.uploadBlock(param);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

代码种注释掉的那句就是出错的部分,这个service我已经在上方注入了,同时这块new的代码没注释掉,
两个实例不一样,springboot找不到注入的实例导致报了空指针的错误。

近期我会找个时间写篇文章把为什么new对象跟自动注入对象同时使用会空指针,还有就算new对象怎么处理才不会出现空指针的问题。

若有问题欢迎大家与我互动交流,如果文章帮到了你,请动动你的小手指给点个小心。另外,每周我会尽量至少更新一篇博客文章,喜欢的朋友可以加一下关注。

猜你喜欢

转载自blog.csdn.net/Myuhua/article/details/84317582