spring-boot框架dubbo註解@Reference注入service,調用方法時service爲null

服務消費者:

    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
    UserService userService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
    TenantService tenantService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
    private UserPermissionService userPermissionService;

在使用這些對象的時候直接報空指針異常:

   public UserDTO getUserDTOByClientId(String clientId) {
        log.info("userservice======"+userService);
        return userService.getUserInfo(clientId);
    }

經確認–打印對象爲null。
分析:
由於運維腳本衝突,所以每次啓動需要先啓動服務消費者,再啓動服務提供者,查看日誌zk能夠notify服務消費者提供者的註冊信息,但是調用的時候對象獲取不到–NullpointException。

解決方案

1、採用懶加載:


    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
    UserService userService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
    TenantService tenantService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
    private UserPermissionService userPermissionService;

2、首先啓動服務提供者,然後再啓動服務消費者。
3、通過查閱資料認爲,dubbo註解設置中有個check參數設置爲 check=false,當服務提供者還沒有啓動的時候,服務消費者會在對象初始化的時候,創建相應的代理對象,不會產生一個null對象。這種方案相對比較合適,推薦使用。


    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
    UserService userService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
    TenantService tenantService;
    @Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
    private UserPermissionService userPermissionService;

詳情可參考:http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html

在這裏插入圖片描述

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章