如何在 gRPC 的 responseObserver.onError() 中传输详细异常消息

How can I transfer a detail exception message within gRPC's responseObserver.onError()

我正在尝试传输描述 gRPC 异常的详细消息。我知道我应该使用 responseObserver.onError 来传输它,gRPC 提供元数据来做它,但我仍然不知道把它放在哪里,因为我无法创建元数据,元数据的所有构造函数不是 public.

static class GrpcTestService extends GrpcTestGrpc.GrpcTestImplBase {

        @Override
        public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
            try {
                HelloResponse reply = HelloResponse.newBuilder().setMessage("got it ! " + req.getName()).build();
                throw new RuntimeException("I'm an exception!!!");
//                responseObserver.onNext(reply);
//                responseObserver.onCompleted();
            } catch (Exception e) {
                responseObserver.onError(new StatusRuntimeException(Status.ABORTED, new Metadata("metadata exception".getBytes())));
            }
        }
    }

如上所述,我无法通过 'new Metadata("xxxx")' 创建元数据,所以如何将我的特殊消息包装在 responseObserver.onError 中?

要发送详细消息,请将其附加到带有 withDescriptionStatus:

Status.ABORTED.withDescription("The detailed reason")

该描述有助于开发者调试系统。它不适用于机器消耗。

Metadata 的构造函数是 public,但没有参数。您可以使用 new Metadata() 创建它,然后可以使用 put(Key<T> key, T value) 之类的内容对其进行修改。元数据对于发送机器可理解的错误详细信息很有用。