背景:
远程调用服务时,同一个Controller下的接口有的调用成功,有的调用失败,失败的错误原因为空指针。看下边这段代码
@PostMapping(value = "/draft")
@ApiOperation("存草稿")
private Response<Long> Draft(@RequestBody ItemPublishCreateRequest request) {
return itemPublishFacade.saveDraft(request);
}
我这段代码中itemPublishFacade.saveDraft(request) 是其他服务的接口,当我调用这个接口的时候为什么itemPublishFacade为空?
解释:
项目用的是dubbo,前提是我已经注册了这个服务,但是调用的时候仍然是null。Facade是service的上一层次我们自己包装的。
@Bean
public ItemPublishFacade itemPublishFacade(){
return serviceSubscriber.consumer(ItemPublishFacade.class).checked(false).subscribe();
}
我从注册这个服务开始到aop切面,解决了一天都没找到到底出错在哪儿,但是他其实就是很小的一个问题,检查起来却花费了很多的时间,真的是不可原谅的错误。
我不说有什么问题,你们自己能看出来为什么会出错吗?
解决:
问题出在的接口的访问级别,如果方法被标记为 private,那么它将不会被暴露给外部调用,包括 Dubbo 消费者。
结果是,当尝试通过 Dubbo 调用此方法时,将会因为找不到对应的方法而失败。
@PostMapping(value = "/draft")
@ApiOperation("存草稿")
private Response<Long> Draft(@RequestBody ItemPublishCreateRequest request) {
return itemPublishFacade.saveDraft(request);
}
@PostMapping(value = "/draft")
@ApiOperation("存草稿")
public Response<Long> Draft(@RequestBody ItemPublishCreateRequest request) {
return itemPublishFacade.saveDraft(request);
}
这样对比看是不是比较容易看出来了。只有用public才能供外部调用,大家一定要仔细。通过这个文章也可以在遇到这个问题快速解决问题了。