[apache/dubbo]使用triple协议,提供方provider方法重载,consumer方消费报错,provider方空指针

2023-12-08 539 views
1

Environment

  • Dubbo version: 3.2
  • Operating System version: windows 10
  • Java version:1.8

Steps to reproduce this issue

  1. 在provider侧提供重载方法如下 1695871853510
  2. 在consumer侧分别调用两个重载方法
  3. provider报错NPE 1695871935061

Expected Behavior

期望能正常调用

Actual Behavior

consumer image provider 1695871991526

Just put your stack trace here!

回答

3

3.3是指分支吗,我用3.2分支测试的,我等下试试3.3分支?代码用的是dubbo-demo/dubbo-demo-triple,只是简单的在GreeterService.java类中新增了一个重载方法 `public interface GreeterService {

/**
 * Sends a greeting
 */
HelloReply sayHello(HelloRequest request);

String sayHello(String name);

CompletableFuture<String> sayHelloAsync(String request);

}`

7

能否提供完整的代码?个人测试服务端的简单重载在3.3下可以跑通 :) image 3.3分支调用也是一样的错误;其原因是在ReflectionAbstractServerCall.java类startCall方法中根据methodName获取methodDescriptors的size等于2,并且此时重载方法并不是ServerStream或者BiStream导致未找到methodDescriptor。startCall方法也未兼容根据methodName获取methodDescriptros的size大于2的场景 image image

0

有 pb存在时不建议使用重载,wrapper模式的 md 是在 data 响应时填充的,而 pb (stub)模式下不支持重载,他会基于 header 中的元数据就找到md

由于当有重载发生时同一个 method name能拿到多个 md,需要依赖更多信息才能知道当前是哪个 md,但因为非 wrapper 模式下是不包含其他信息的,所以无法找到 md,导致 npe 的发生

同一个类中不包含 pb 的两个方法重载就是可以的,类似这样 :

public interface GreeterWrapperService {

    /**
     * Sends a greeting
     */
    String sayHello(String request);

    String sayHello(Integer name);
}
3

那是否应该在程序启动时检测下provider重载行为并提前报错,否则在程序运行中框架报错空指针报错也并不是非常友好的行为

这个可以的,欢迎你提个 pr 来 check 一下

你提到的pb,是指什么。好的我稍后会提个pr

protobuf 的类,用proto 文件生成的 class