有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

反射如何获取在grpcjava中调用的rpc方法的注释

在使用不同的验证器调用不同的rpc方法之前,我需要验证请求

所以我实现了如下验证器

class BarRequestValidator {
    public FooServiceError validate(BarRequest request) {
        if (request.bar.length > 12) {
            return FooServiceError.BAR_TOO_LONG;
        } else {
            return null;
        }
    }
}

并在我的rpc方法之前添加自定义注释

class FooService extends FooServiceGrpc.FooServiceImplBase {
    @Validated(validator = BarRequestValidator.class)
    public void bar(BarRequest request, StreamObserver<BarResponse> responseObserver) {
        // Validator should be executed before this line, and returns error once validation fails.
        assert(request.bar <= 12);
    }
}

但我发现我找不到在gRPC ServerInterceptor中获取注释信息的方法。有没有办法像这样实现grpc请求验证


共 (1) 个答案

  1. # 1 楼答案

    无需注释,只需使用普通的ServerInterceptor即可完成此任务:

    Server s = ServerBuilder.forPort(...)
        .addService(ServerInterceptors.intercept(myService, myValidator))
        ...
    
    private final class MyValidator implements ServerInterceptor {
      ServerCall.Listener interceptCall(call, headers, next) {
        ServerCall.Listener listener = next.startCall(call, headers);
        if (call.getMethodDescriptor().getFullMethodName().equals("service/method")) {
          listener = new SimpleForwardingServerCallListener(listener) {
            @Override
            void onMessage(request) {
              validate(request);
            }
          }
        }
        return listener;
      }
    }
    

    请注意,我跳过了这里的大部分样板。当一个请求进入时,拦截器首先得到它,并检查它是否支持它所期望的方法。如果是这样,它会进行额外的验证。在生成的代码中,您可以引用现有的MethodDescriptor,而不是像上面那样复制名称