服务消费者:
@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