現在將網上的方法總結一下
方法一:.https://blog.csdn.net/u011294519/article/details/81810631
dubbo-provider.xml:提供者先掃描spring框架,完成spring部分的掃描,然后將為dubbo框架提供服務;消費者部分相反,先掃描dubbo服務,后掃描spring部分~
1. 背景
使用@Reference注解實現消費者調用服務端代碼,調用報錯NullPointerException,如圖:
注意:如果你的服務端沒有注冊到dubbo,客戶端在調用時也會出現NullPointerException報錯,所以可以先到dubbo-admin去看下服務端是否已經正常注冊。
dubo-admin安裝方式可參照:
https://blog.csdn.net/u011294519/article/details/81712601
2. 服務端代碼
因為只是寫一個小demo,代碼邏輯十分簡單
2.1. 服務端接口
2.2. 服務端接口實現類
注意:這里的@Service注解需要使用com.alibaba.dubbo.config.annotation.Service。
2.3. 服務端dubbo配置文件
3. 客戶端代碼
3.1.接口
3.2. 測試接口
3.3. 配置文件
4. Dubbo-admin結果
到這里為止看上去都很正常,但是只要客戶端調用服務端方法就報NullPointerException。
5. 解決方法
網上找了很多方法,但是都不能解決問題,后來想到有沒有可能是SpringMVC的包掃描影響了dubbo的注解掃描,然后嘗試着將dubbo的包掃描配置單獨抽出來,放在SpringMVC配置的最上面,果然問題解決。如圖:
然后把dubbo配置中的這個去掉,問題解決。
但是我的問題沒有解決
方法二:https://blog.csdn.net/yuzhibo0924/article/details/80091646
最近開發公司項目,遇到了dubbo服務為空的情況,現在把出現的情況做個簡單的總結:
dubbo為空會報空指針異常!
1.第一種情況:引用有誤,也就是再注入dubbo服務的時候,使用@Reference注解的時候,引用的並不是ali的dubbo,所以一直引入的都是錯誤的。導致注入為null;
這種情況比較常見,因為粗心大意導致import 文件錯誤,只需要認真檢查。就可以找出問題所在。
2.第二種情況:引用很正常,使用的是@Reference的注解,也是ali的dubbo。
但具體情況是:(我本人的情況)自己在本地測試,代碼流程完全沒有任何問題。於是將代碼提交到開發環境進行代碼測試,一切正常。然后提交測試,交由測試進行代碼測試。發現問題,最后定位到dubbo服務為空。引用沒有問題,那是什么原因導致的dubbo服務為null呢?后來經過同事指導,才明白問題所在。在同一個項目中,A服務引用B服務(都是注冊到dubbo上的),在項目部署發布的時候,無法判斷是哪個服務先注冊到dubbo上的。所以在A服務中引用B服務,而且通過dubbo的方式注入,極有可能會產生服務注入為null的情況。那么此時在A服務中引用B服務,就可以使用spring框架帶的@Autowired的注入方式,將B服務引用進來。這樣就可以完美解決這個問題。
但是我的問題依舊沒有解決
方法三:原因是包名不一致,包名不一致會導致提供者和消費者不在一個節點上,這樣消費者永遠不會獲得值!!
但是也沒有解決我的問題
方法四:
項目設計之初是想分布式部署,所以分了客戶端,和服務端。經過測試發現真的是程序啟動的順序問題。
之前都是先啟動server服務端,然后在啟動client端的,但是這兩天項目有點趕,調試的時候,想快點啟動,所以幾乎是同時啟動server和client程序,甚至client先啟動,然后就導致了本文標題的錯誤。之后我就老老實實的先啟動server程序,在啟動client。
---------------------
原文:https://blog.csdn.net/likawei1314/article/details/80757687
方法五:
@SpringBootApplication之前添加注解@EnableDubboConfig就可以解決了,確保優先加載dubbo配置。