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

在这里插入图片描述

发布了41 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yunwei_Zheng/article/details/104018337