SpringBoot 多模組專案(module)Service自動注入(@Autowired)空指標錯誤解決
阿新 • • 發佈:2018-11-23
報錯資訊,這個我是截了上一部分,為了省空間下部分我就用...代替了。
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物件怎麼處理才不會出現空指標的問題。
若有問題歡迎大家與我互動交流,如果文章幫到了你,請動動你的小手指給點個小心。另外,每週我會盡量至少更新一篇部落格文章,喜歡的朋友可以加一下關注。