1. 程式人生 > >SpringBoot 多模組專案(module)Service自動注入(@Autowired)空指標錯誤解決

SpringBoot 多模組專案(module)Service自動注入(@Autowired)空指標錯誤解決

 報錯資訊,這個我是截了上一部分,為了省空間下部分我就用...代替了。

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物件怎麼處理才不會出現空指標的問題。

若有問題歡迎大家與我互動交流,如果文章幫到了你,請動動你的小手指給點個小心。另外,每週我會盡量至少更新一篇部落格文章,喜歡的朋友可以加一下關注。